SlideShare una empresa de Scribd logo
1 de 50
Módulo 2: Introdução a
arquiteturas modernas
  Integrante do curso Práticas
modernas de desenvolvimento de
software utilizando a plataforma
               .NET
Introdução
Este curso busca mostrar para o aluno uma
visão ampla e um vocabulário mínimo para
que seja possível prosseguir falando
assuntos como Domain-Driven Design, Test-
First Development e muito mais. Com este
entendimento mínimo o aluno conseguirá
ter base para conseguir analisar a
arquitetura de um projeto moderno de
mercado.
Introdução
• Este curso falará apenas de sistemas, isto é, programas
  feitos para resolver problemas de negócio.
• Outros tipos de sistemas, como jogos ou softwares mais
  específicos também se utilizam de alguns conceitos
  básicos e universais que serão apresentados neste curso.
Software em 2012
• Antigamente os sistemas eram menores. As
  ferramentas eram mais restritas e os times
  eram menores. As regras de negócio ficavam
  nas telas e o eventual acesso a banco de
  dados também ficava nas telas.
• Este modelo de desenvolvimento torna o
  sistema extremamente mais difícil de
  manter, pois as responsabilidades acabavam
  por se misturar, aumentando o risco de se
  corrigir ou criar novas funcionalidades.
Software em 2012
• Com o passar do tempo e com a evolução das
  ferramentas de desenvolvimento, as empresas
  acabaram notando que era possível entregar cada
  vez mais funcionalidades.
• Entregar novas funcionalidades significa também,
  saber organizá-las de forma coerente. Entretanto,
  a comunidade sempre teve grande dificuldade em
  organizar o software de maneira decente.
• Desde os anos 70 surgiram alguns pilares do
  software moderno como a orientação a objetos e
  a separação de responsabilidades entre as diversas
  partes do software.
Software em 2012
• O padrão MVC acabou por se popularizar,
  espalhando pela comunidade também, a
  ideia de separação de responsabilidades
  entre modelo de dados, telas e controllers,
  que organizam o fluxo de telas.
Software em 2012
• Este conceito, que é a separação de
  responsabilidades, funciona até hoje. É um pilar fundamental
  de qualquer software bem escrito.
• A evolução das ferramentas, como a criação de IDEs mais
  completas, a modernização de linguagens de programação, a
  evolução dos sistemas operacionais e as fundamentais
  melhorias nas capacidades de exibir itens nas telas trouxe
  mudanças radicais de paradigmas no desenvolvimento de
  software: um novo mundo se apresentava para os
  desenvolvedores, que tinha que enfrentar desafios novos
  como a programação para Windows, utilização de
  mouse, ambiente multitarefas e mais. Esta evolução acabou
  aumentando radicalmente os graus de liberdade das
  aplicações então desenvolvidas.
Software até 2012
• Este aumento de graus de liberdade dos sistemas
  aumentou proporcionalmente a complexidade do
  código gerado para suportar tudo isso. Novos
  problemas de manutenção de código começaram
  a aparecer.
• Com a evolução dos sistemas operacionais tanto
  de desktop como de servidores, as empresas
  começaram a explorar novas possibilidades, como
  a troca de dados automatizada entre sistemas,
  aumentando novamente a complexidade do
  software produzido.
Software até 2012
• O número de projetos
  fracassados, abandonados ou atrasados era
  alto. A comunidade ainda não estava pronta
  para trabalhar com coesão e simplicidade.
• Com o passar do tempo e o surgimento de
  plataformas como Java e .NET, a comunidade
  estabeleceu um norte para conseguir
  organizar todo o código produzido e
  conseguiu padronizar alguns conceitos
  básicos.
Software até 2012
• Além de ter havido um grande aumento de criação
  de software para desktops, o surgimento da
  internet para o grande público revolucionou
  também a forma de se construir software
  corporativo. O deploy de uma aplicação desktop
  sempre é um transtorno e a possibilidade de
  colocar cuidar de apenas um ambiente para
  realizar o deploy popularizou muito as aplicações
  web.
• Porém, esta nova forma de criar sistemas
  ocasionou, novamente, uma nova geração de
  sistemas sem uma arquitetura decente.
Software até 2012
• Os bancos de dados relacionais se tornaram
  padrão de mercado e inúmeros sistemas, de todos
  os tamanhos, passaram a utilizar bancos de dados
  como Oracle, SQL Server, MySQL e muitos outros.
• A capacidade de centralizar a lógica de negócios
  em um único lugar fascinou muitos
  desenvolvedores, que conseguiram fazer com que
  os bancos de dados fossem responsáveis por uma
  grande parte da lógica de negócio da aplicação.
  Com isso, com a popularização de sistema de
  banco de dados, muitos sistemas contavam com
  uma quantidade brutal de código em procedures.
Software até 2012
• A comunidade foi amadurecendo. Os times
  foram crescendo a necessidade de entregar
  valor foi crescendo. A lógica muito espalhada
  ou muito centralizada acabou por dificultar
  brutalmente a manutenção dos
  sistemas, fazendo com que estes muitas
  vezes fossem refeitos do zero. Lógica
  espalhada por cada página ou lógica
  centralizada no banco de dados torna a
  manutenção e a paralelização de tarefas
  árduas.
Software até 2012
• A comunidade chegou ao conceito de
  separação de responsabilidades mais formal,
  trazendo à tona o conceito de aplicações em
  camadas e a necessidade de organizar as
  diferentes partes a aplicação de forma
  adequada.
• Alcançando uma adequada organização do
  software de forma padronizada, grande parte
  da comunidade tem se beneficiado de uma
  forma inteligente, otimizada e universal de se
  desenvolver software.
Conceitos Iniciais: Fluxo de dados
• A maioria absoluta dos sistemas trabalham
  com dados. Uma forma simples de entender
  um sistema é analisando o caminho que a
  informação percorre dentro do sistema. Em
  geral, a informação é criada na camada de
  apresentação, processada pela camada de
  negócio e persistida em um banco de dados.
  E faz o mesmo caminho para retornar para o
  usuário.
Conceitos Iniciais: Fluxo de dados
• Conhecendo o caminho que a informação
  percorre no sistema, é possível
  compreender com facilidade como é a
  arquitetura do sistema.
Conceitos Iniciais: Camadas
• Ao desenhar o fluxo de dados da aplicação, a
  informação poderá passar por uma, duas ou
  máquinas do começo ao fim. Estas máquinas,
  onde a aplicação roda, são consideradas camadas
  físicas. Como exemplo de camadas físicas,
  podemos citar servidores web, servidores de
  aplicação, servidores de aplicação, celular, browser
  de um desktop, etc – a camada física é onde a
  aplicação fisicamente é executada.
• Uma aplicação atual típica costuma ter um
  servidor web, um servidor de banco de dados e
  um browser rodando no desktop do usuário final.
Conceitos Iniciais: Camadas
• Ao desenhar o fluxo de dados da aplicação, a
  informação poderá passar por uma, duas ou várias
  máquinas físicas do começo ao fim. Estas
  partes, onde a aplicação roda, são consideradas
  camadas físicas. Como exemplo de camadas
  físicas, podemos citar servidores web, servidores
  de aplicação, servidores de
  aplicação, celular, browser de um desktop, etc – a
  camada física é onde a aplicação fisicamente é
  executada.
• Uma aplicação atual típica costuma ter um
  servidor web, um servidor de banco de dados e
  um browser rodando no desktop do usuário final.
Conceitos Iniciais: Camadas
• Um sistema típico possui pelo uma camada de
  apresentação e uma camada de negócios e outra de
  acesso a dados (comumente conhecida por
  persistência). Estas camadas são chamadas de
  camadas lógicas. A camada lógica, ou simplesmente
  camada na visão do desenvolvedor, representa a
  separação básica de responsabilidade do software. Por
  exemplo, a camada de apresentação é responsável por
  toda a interação browser-servidor web, mecânica de
  tela, validação de entrada de dados e correlatos.
  Mesmo que a aplicação tenha uma versão web e outra
  mobile, ainda assim a aplicação só terá uma única
  camada de apresentação.
Principais camadas
• As principais camadas são:
  – Apresentação
  – Negócio / Serviços
  – Acesso a dados
  – Infraestrutura
• Ao utilizar a plataforma .NET, é possível
  trabalhar utilizando C# na maioria das
  camadas da aplicação.
Arquitetura 3 camadas
• A maioria dos sistemas construídos desde a popularização da
  plataforma .NET utiliza a divisão em 3 camadas:
  apresentação, negócio e acesso a dados.
• Este estilo de arquitetura é de longe o mais conhecido na
  comunidade.
• Este padrão conseguiu fazer com que as empresas
  aumentassem as equipes, permitindo paralelismo de tarefas e
  aumentando a quantidade de software entregue. Este padrão
  fez bastante sucesso na comunidade e se tornou o padrão de
  projetos das consultorias e empresas.
• Para suportar as necessidades atuais de software, o
  paradigma de aplicações 3 camadas acabou não sendo
  suficiente.
Arquitetura N-Camadas
• A arquitetura 3 camadas tradicional não atende
  aos novos requisitos de software, como por
  exemplo, a criação de software testável, orientado
  a domínio, flexível e simples de manter.
• Quando se fala em N camadas, fala-se de
  múltiplas camadas lógicas, claras e bem definidas,
  que destrincham melhor as camadas do modelo 3-
  camadas.
• A separação do software em responsabilidades
  ainda menores e mais bem definidas tem sido uma
  tendência mundial da comunidade.
Camada de Apresentação
• No mundo .NET, as camadas de apresentação
  têm evoluído de forma brutal nos últimos 5
  anos. Hoje em dia a aplicação pode ser
  construída como:
  – ASP.NET Web Forms / ASP.NET MVC
  – Silverlight
  – WPF
  – Windows Forms
  – Console Application
Camada de Apresentação
• As aplicações web dominaram o mercado de software
  corporativo e um dos motivos do sucesso da
  plataforma .NET é a relativa facilidade em se construir
  aplicações web em pouco tempo.
• Hoje em dia, com o ASP.NET MVC a maior facilidade
  para se trabalhar com código client-side, o
  desenvolvedor precisa conhecer
  Javascript, jQuery, HTML(5), CSS(2.1 e 3.0) e diversos
  frameworks e tecnologias auxiliares, como por
  exemplo, Ajax. Isto faz com que o desenvolvimento
  web seja desafiador, porém, muito interessante por ter
  uma abrangência quase universal – a maioria dos
  dispositivos modernos consegue processar aplicações
  web criadas com padrões atuais de HTML, Javascript e
  CSS.
Camada de Apresentação
• Com .NET, também há opções para ambientes que rodam somente
  Windows. Como a vasta maioria dos clientes corporativos utiliza o
  Windows como sistema operacional, há grandes chances de ser
  possível utilizar estas outras opções para construir sua aplicação.
• A Microsoft oferece a possibilidade de trabalhar com dispositivos
  móveis utilizando a plataforma Windows 8, que compreende tablets,
  celulares e desktops. É possível criar Metro-style applications que
  suportam o .NET 4.5 e se utilizam uma versão nativa da tecnologia
  empregada no Silverlight e WPF: XAML. Outra vantagem de se criar
  apps para Windows 8 é que é possível programar tanto em C#
  quanto Javascript e C++. AS aplicações Metro rodam nativamente e
  não utilizam o .NET – elas utilizam o WinRT, que é uma atualização
  do Win32 e que suporta o mesmo estilo de bibliotecas do .NET.
Camada de Negócios
• As regras de negócio devem ficar no código fonte e
  não mais no banco de dados. As regras também não
  podem ficar armazenadas na tela.
• A camada de negócios é responsável por orquestrar o
  acesso a recursos como banco de dados, webservices
  externos e é responsável também por retornar ao
  usuário a resposta de suas requisições. Vale notar que
  a aplicação é responsável por aceitar imediatamente
  as requisições do usuário e não
  necessariamente, precisa retornar a resposta da
  requisição imediatamente. A camada de negócios é o
  coração da aplicação em qualquer tipo de arquitetura.
Camada de Acesso a Dados
• Como dito anteriormente, quase todos os sistemas trabalham
  com dados. A camada de acesso a dados recebe comandos da
  camada de negócios e providencia acesso aos dados
  guardados no banco de dados.
• Antigamente o código de acesso dados era muito
  tedioso, repetitivo e suscetível a erros. Basicamente, os
  desenvolvedores escreviam comandos SQL para operações
  CRUD e lógicas avançadas eram feitas chamando procedures.
  A comunidade acabou criando ferramentas chamadas OR/Ms
  - object-relational mapping. Estas ferramentas conseguem
  fazer com que a aplicação veja tabelas do banco de dados
  como classes, simplificando o código de acesso a dados em
  90% - hoje em dia não é mais necessário montar comandos
  SQL dentro do código-fonte. Um OR/M consegue gerar
  comandos SQL automaticamente.
Camada de Acesso a Dados
• Os OR/Ms mais populares são: NHibernate e Entity
  Framework na comunidade .NET. Há muitos
  similares, pagos e gratuitos, mas geralmente só se
  pensa nestas duas opções ao criar escolher um OR/M.
• O NHibernate é mais maduro e oferece uma maior
  gama de configurações para melhorar a performance
  da aplicação.
• O Entity Framework tem recebido atualizações
  constantes da Microsoft – o seu ciclo de
  desenvolvimento não é atrelado às versões do .NET –
  ou seja – a Microsoft tem trabalhado com a
  comunidade para gerar versões mais rapidamente e
  focando no que a comunidade tem pedido.
Camada de Acesso a Dados
• O uso de LINQ é suportado pelas duas
  ferramentas – é possível montar consultas usando
  sintaxe parecida com SQL para gerar consultas no
  banco de dados.
• Ambos suportam os bancos de dados mais
  comuns do mercado, como Oracle, SQL Server e
  MySQL.
• A utilização de OR/M acelera bastante o
  desenvolvimento e desfavorece a colocação de
  lógica complexa no banco de dados – todos os
  dados que chegam do banco de dados precisam
  ser mapeados para uma classe da aplicação.
Camada de Acesso a Dados
•   Nos últimos anos, uma nova tendência surgiu no mercado - a utilização de
    banco de dados NOSQL.
•   NOSQL é interpretado normalmente como “not only SQL” – na prática, isto
    significa que a tecnologia de persistência de dados não necessariamente é
    um banco de dados clássico, como SQL Server ou Oracle – hoje em dia há
    múltiplas classes de bancos de dados, que rompem completamente com o
    modelo relacional para serem bons em alguma área específica.
•   Com o uso de NoSQL, é possível criar aplicações extremamente rápidas,
    poderosas, flexíveis e fáceis de manter. Esta tendência está mudando
    radicalmente a forma de pensar no acesso a dados de uma aplicação
    moderna.
•   Ultimamente, provedores de serviços de storage e servidor na nuvem
    oferecem novas possibilidades de se trabalhar com informações de formas
    simples e com alta performance. Em 2012, as opções para construir software
    moderno são brutalmente mais abundantes que há 10 anos atrás.
Camada de Serviços
• Um sistema pode expor seus dados e sua lógica para o mundo
  externo sem precisar de uma camada de apresentação. Com isso,
  outros sistemas podem consumir estes dados.
• A forma mais comum de trocar dados entre sistemas via
  intranet/internet é através da utilização de web services.
• As trocas de dados entre sistemas precisam aderir a um padrão de
  formato de mensagem para que software construído em qualquer
  plataforma consiga consumir serviços de outra plataforma qualquer.
• O crescimento da internet e a popularização de tecnologias como
  SOA e REST faz com que a camada de serviços da aplicação hoje em
  dia seja muito mais complexa, pois ela pode ter que lidar com
  problemas de segurança, cache, operações de longa duração, uso
  de múltiplos servidores de aplicação entre outros tipos de desafios.
Camada de Serviços
• Os serviços expõem dados utilizando XML ou JSON. O
  uso de XML é comum em aplicações corporativas, que
  exigem um formato de dados rígido que também está
  no mercado há mais tempo. Aplicações modernas para
  a internet aberta são construídas utilizando JSON, que
  é um formato de dados mais simples, leve, flexível e
  fácil de se trabalhar com Javascript e demais
  frameworks de mercado.
• A utilização de serviços mais simples, que trabalham
  com JSON é o padrão para aplicações mobile e AJAX –
  estas dependem de tráfego de dados otimizado para
  situações de internet lenta e intermitente.
Camada de Infraestrutura
• Os sistemas geralmente dependem de
  outras coisas para trabalhar. É raro
  encontrar uma aplicação que só tenha as
  três camadas básicas. Serviços de e-mail,
  log, segurança e correlatos são
  considerados parte da camada de
  infraestrutura – estes podem ser utilizados
  por qualquer outra camada.
Arquiteturas orientadas a dados
• Uma parcela enorme dos sistemas que estão no ar e mesmo
  os que estão construídos foram pensados utilizando o
  conceito de modelo de dados.
• Neste modelo, as tabelas e seus relacionamentos guiam toda
  a arquitetura da aplicação. As entidades da aplicação são as
  mesmas entidades do banco de dados.
• Embora bem sucedido até para projetos maiores, a sociedade
  notou que a manutenção destes sistemas acaba sendo muito
  cara – mudanças simples como adição de uma coluna
  provocam alterações em múltiplas classes.
• Para aplicações simples, muitas vezes a camada de negócios
  não faz absolutamente nada – este fato é muitas vezes faz
  com que o desenvolvedor iniciante pense que é inútil ter uma
  camada de negócios.
Arquiteturas orientadas a dados
• Muitas empresas criaram geradores de código para “automatizar” a
  produção de um código em geral muito repetitivo. Logo, a alteração
  do código gerado provoca outro custo de manutenção. Este
  problema é suavizado com a utilização de um OR/M.
• Para o desenvolvimento orientado a dados, o banco de dados passa
  a ser o centro de gravidade da aplicação – o resto da aplicação serve
  apenas de ferramenta para cadastrar e utilizar informação.
• O desenvolvimento orientado a dados não favorece a testabilidade
  do sistema – geralmente é muito difícil testar a lógica de negócios
  do sistema de forma isolada – a maioria dos testes viáveis acabam
  de alguma forma tocando o banco de dados, tornando-se testes de
  integração mais lentos.
• O código gerado por uma arquitetura destas não é orientado a
  objetos. Este tipo de sistema é simplesmente uma sequência de
  procedimentos para escrever no banco de dados.
Arquiteturas orientadas a domínio
• Como uma resposta aos efeitos colaterais das
  arquiteturas orientadas a dados, a comunidade
  trouxe à tona o DDD (Domain-Driven Design)
• Esta metodologia é uma mudança dura e brutal de
  paradigma – o banco de dados deixa de ser o
  centro da aplicação.
• O domínio, isto é, o problema que a aplicação
  resolve vira o centro de gravidade da aplicação.
  Esta mudança faz, na prática, que o banco de
  dados fique no mesmo nível de outros serviços – é
  apenas um item que o domínio utiliza para
  resolver o problema de negócios.
Arquiteturas orientadas a domínio
• O DDD é uma forma mais complexa de se desenvolver software.
  Entretanto, esta metodologia é focada na construção de sistemas
  que sejam orientados a objetos, fáceis de manter, fáceis de testar e
  com responsabilidades muito bem definidas. Ou seja: há uma trade-
  off entre esforço de desenvolvimento e custo de manutenção no
  futuro. Para empresas com produtos próprios e duradouros, faz
  muito sentido pensar na aplicação de DDD e suas técnicas.
• O DDD traz consigo muitas práticas interessantes de
  desenvolvimento de software, como TDD (Test-Driven Development)
  e o desenvolvimento ágil. Com isso, só se constrói software que
  realmente será utilizado pela aplicação final, nem mais nem menos.
  O código produzido com TDD tende a ser muito mais
  legível, simples e focado em trazer resultados mais concretos e
  óbvios.
• O código orientado a domínio é orientado a objetos e tende possuir
  um acoplamento muito inferior ao visto nos sistemas orientados a
  dados.
Exemplo: Arquitetura 3 camadas
   focada no banco de dados

                  Apresentação
                                   Legenda:
                                   O projeto A utiliza o projeto B
 Infraestrutura




                     Negócio                  A



                                              B
                  Acesso a dados
Exemplo: Arquitetura n-camadas
     focada em domínio
Organização da camada de apresentação
• Ao iniciar um projeto do zero, além de
  decidir quais camadas e qual metodologia
  será utilizada, é necessário, entre várias
  outras decisões, estabelecer como será a
  estrutura da camada de apresentação.
• Esta decisão é importante pois pode ser a
  diferença entre ter um projeto simples ou
  complexo de manter.
Organização da camada de apresentação
• Algumas tecnologias, como Windows
  Forms e ASP.NET Web Forms permitem as
  criação de arquivos code-behind. Este
  arquivo é necessário para que seja possível
  responder a eventos como click, double-
  click e também, eventos de componentes.
  Este tipo de código é orientado a eventos
  e tende causar um enorme acoplamento
  tela-regra de negócio, pois todas as ações
  são tomadas utilizando eventos de tela.
Organização da camada de apresentação
• O uso de code-behind prejudica a
  testabilidade de código. Regras de
  negócio misturadas com eventos de tela é
  a receita perfeita para criar sistemas
  impossíveis de manter.
• A maior parte dos novos desenvolvedores
  simplesmente não entende a motivação
  do código existente. Logo, código recém-
  criado acaba piorando mais ainda a
  situação, levando o sistema a um caos.
Organização da camada de apresentação
• Para trazer sanidade ao desenvolvimento do
  front-end, a comunidade criou vários padrões
  estruturais adequados para cada cenário. São
  eles:
  – MVC – Model-View-Controller
  – MVP – Model-View-Presenter
  – MVVM – Model-View-ViewModel.
• Basicamente estes padrões servem para
  trazer uma separação básica entre a lógica
  que manipula a tela, dados que alimentam a
  tela e os fluxos da aplicação.
Organização da camada de apresentação
• A View é o que aparece na tela em si. No
  mundo do .NET temos:
  - ASP.NET Web Forms -> .aspx
  - ASP.NET MVC -> .cshtml
  - Silverlight/WPF -> .xaml
  - Windows Forms -> um Form simples
- Das citadas acima, só o ASP.NET não
  permite code-behind – mas permite
  código inline no HTML.
Organização da camada de apresentação
• O Controller, Presenter ou ViewModel é responsável
  por servir de elemento intermediário entre a View e os
  dados da aplicação.
• Esta intermediação ajuda a deixar a View limpa,
  permitindo que a View só se preocupe em mostrar os
  dados vindos do sistema e claro, consiga fazer o
  trabalho de aceitar um input válido do usuário final.
• A comunicação Controller para View tem evoluído
  muito no mundo .NET. O sistema de binding do WPF,
  MVC e até mesmo Web Forms (.NET 4.5) trouxe uma
  grande facilidade de se aplicar databinding neste
  processo de passar dados, diminuindo brutalmente a
  quantidade de código tedioso necessário para
  alimentar uma view.
Organização da camada de apresentação
• A definição de Model hoje em dia é
  relativamente turva. O Model, tecnicamente
  falando, é a classe do .NET que o Controller
  usa para alimentar a View com dados.
• Muitas aplicações não possuem classes
  específicas para representar os dados de uma
  tela – por praticidade algumas equipes
  utilizam as próprias classes de domínio para
  fazer o binding na view. Nestes casos, o
  Model passa a ser o domínio da aplicação.
Boas práticas
• Primordial: sempre que for iniciar uma
  aplicação séria, com múltiplas telas e
  fluxos, utilize DDD e TDD. O mercado cada
  vez mais glorifica os benefícios destas
  técnicas, que vão em consonância com
  metodologias ágeis de desenvolvimento de
  software que norteiam a comunidade hoje
  em dia.
• As boas práticas descritas daqui em diante
  precisam ser avaliadas – o custo e o benefício
  podem variam em cada caso.
Boas práticas
• Para diminuir o acoplamento entre as camadas,
  utilize Dependency Injection. Este padrão faz com
  que cada classe receba pronta toda as suas
  dependências, sem se preocupar em criar
  instâncias das mesmas.
• Ao passar dados entre as camadas, utilize classes
  específicas para este fim. Sempre que possível, crie
  um DTO (Data Transfer Object) para passar os
  dados. Considere passar somente dados
  estritamente necessários para atender a requisição.
  Utilize uma ferramenta para fazer o mapeamento
  automático em todas as situações.
Boas práticas
•   O mesmo vale para as camadas de apresentação. Uma forma comum de se
    trabalhar é utilizando ViewModels, que são classes que possuem só e
    somente só os campos que a View vai utilizar. Mesmo que uma entidade
    principal do domínio se pareça muito com o modelo de uma view, ainda
    assim compensa criar uma ViewModel – há um ganho de liberdade para
    poder evoluir em separado o código da ViewModel sem afetar o domínio. E
    vice-versa. Em geral, utilize uma ViewModel por View.
•   Quando o domínio da aplicação deve depender apenas de interfaces que
    representam o recurso a ser utilizado. Estas interfaces (sim, interfaces do C#)
    funcionam como contratos nos quais o domínio pode confiar para por
    exemplo, enviar um e-mail, utilizar um banco de dados e etc. Esta técnica
    diminui bastante o acoplamento entre as partes da aplicação. Outra
    vantagem é que o uso desta técnica permite a substituição de um recurso
    externo por um objeto falso. Este aumento de facilidade ao testar é
    fundamental para gerar um código mais bem escrito e decente. Por
    exemplo, é possível criar um teste que use dados falsos de um banco de
    dados falso para exercitar uma lógica de domínio. Estes objetos fajutos
    implementam a mesma interface do recurso real, o que para o domínio da
    aplicação é transparente.
Boas práticas
• Crie testes unitários e de integração. Utilize
  ferramentas como NUnit e Moq para ajudar a
  automatizar os testes unitários. Não construa
  testes unitários que toquem o banco de dados – a
  velocidade tende a cair muito. Utilize test doubles
  sempre que possível.
• Utilize ferramentas open-source em seu projeto.
  Um aplicação moderna depende de múltiplos
  frameworks e projetos que automatizam e
  simplificam processos repetitivos e braçais.
  Utilizando ferramentas de terceiros com código
  aberto, é possível cogitar na possibilidade de
  alterar a implementação da ferramenta.
Boas práticas
• Ao optar por design patterns de UI, pense
  nos seguintes padrões:
  – ASP.NET Web Forms: utilizar MVP
  – Windows Forms: utilizar MVP
  – ASP.NET MVC: utilizar MVC
  – Silverlight, WPF: utilizar MVVM

Más contenido relacionado

La actualidad más candente

MVC, MVP e MVVM: Uma Comparação de Padrões Arquiteturais
MVC, MVP e MVVM: Uma Comparação de Padrões ArquiteturaisMVC, MVP e MVVM: Uma Comparação de Padrões Arquiteturais
MVC, MVP e MVVM: Uma Comparação de Padrões Arquiteturais
Jorge Tressino Rua
 
Padrão Arquitetural MVC e suas aplicações para WEB
Padrão Arquitetural MVC e suas aplicações para WEBPadrão Arquitetural MVC e suas aplicações para WEB
Padrão Arquitetural MVC e suas aplicações para WEB
Rafael França
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de Software
eros.viggiano
 

La actualidad más candente (20)

MVC, MVP e MVVM: Uma Comparação de Padrões Arquiteturais
MVC, MVP e MVVM: Uma Comparação de Padrões ArquiteturaisMVC, MVP e MVVM: Uma Comparação de Padrões Arquiteturais
MVC, MVP e MVVM: Uma Comparação de Padrões Arquiteturais
 
Padrão Arquitetural MVC e suas aplicações para WEB
Padrão Arquitetural MVC e suas aplicações para WEBPadrão Arquitetural MVC e suas aplicações para WEB
Padrão Arquitetural MVC e suas aplicações para WEB
 
TDC2016POA | Trilha Arquetetura - Revitalizando aplicações desktop usando Ce...
TDC2016POA | Trilha Arquetetura -  Revitalizando aplicações desktop usando Ce...TDC2016POA | Trilha Arquetetura -  Revitalizando aplicações desktop usando Ce...
TDC2016POA | Trilha Arquetetura - Revitalizando aplicações desktop usando Ce...
 
Estudo de caso ASP.NET MVC e Silverlight
Estudo de caso ASP.NET MVC e SilverlightEstudo de caso ASP.NET MVC e Silverlight
Estudo de caso ASP.NET MVC e Silverlight
 
TDC2016SP - Revitalizando aplicações desktop usando CefGlue, MessageBus e Rea...
TDC2016SP - Revitalizando aplicações desktop usando CefGlue, MessageBus e Rea...TDC2016SP - Revitalizando aplicações desktop usando CefGlue, MessageBus e Rea...
TDC2016SP - Revitalizando aplicações desktop usando CefGlue, MessageBus e Rea...
 
Arquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAOArquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAO
 
Padrões de Projeto WEB e o MVC
Padrões de Projeto WEB e o MVCPadrões de Projeto WEB e o MVC
Padrões de Projeto WEB e o MVC
 
Aula01 arquitetura clienteservidor
Aula01 arquitetura clienteservidorAula01 arquitetura clienteservidor
Aula01 arquitetura clienteservidor
 
Aula 1 - Programação Dinâmica para Web
Aula 1 - Programação Dinâmica para WebAula 1 - Programação Dinâmica para Web
Aula 1 - Programação Dinâmica para Web
 
MVC MVP MVVM para Web
MVC MVP MVVM para WebMVC MVP MVVM para Web
MVC MVP MVVM para Web
 
4º FastShow - WPF Windows Presentation Foundation Overview
4º FastShow - WPF Windows Presentation Foundation Overview4º FastShow - WPF Windows Presentation Foundation Overview
4º FastShow - WPF Windows Presentation Foundation Overview
 
Camadas
CamadasCamadas
Camadas
 
Apresentação mvc
Apresentação mvcApresentação mvc
Apresentação mvc
 
O (papel do) Arquiteto de Software
O (papel do) Arquiteto de SoftwareO (papel do) Arquiteto de Software
O (papel do) Arquiteto de Software
 
Arquitetura de Software Visão Geral
Arquitetura de Software Visão GeralArquitetura de Software Visão Geral
Arquitetura de Software Visão Geral
 
Arquitetura de Software EXPLICADA
Arquitetura de Software EXPLICADAArquitetura de Software EXPLICADA
Arquitetura de Software EXPLICADA
 
Padrões Arquiteturais de Sistemas
Padrões Arquiteturais de SistemasPadrões Arquiteturais de Sistemas
Padrões Arquiteturais de Sistemas
 
Oficina cake php
Oficina cake phpOficina cake php
Oficina cake php
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de Software
 
AVALIAÇÃO DE MODELOS DE ARQUITETURA DE WEB SITES DE ALTA ESCALABILIDADE
AVALIAÇÃO DE MODELOS DE ARQUITETURA DE WEB SITES DE ALTA ESCALABILIDADEAVALIAÇÃO DE MODELOS DE ARQUITETURA DE WEB SITES DE ALTA ESCALABILIDADE
AVALIAÇÃO DE MODELOS DE ARQUITETURA DE WEB SITES DE ALTA ESCALABILIDADE
 

Similar a Introdução a arquitetura de sistemas com .NET

Saa s software como serviço (slides)
Saa s   software como serviço (slides)Saa s   software como serviço (slides)
Saa s software como serviço (slides)
Daniela Nunes
 
3a Web Aula - Gestão de Tecnologia da Informação.pdf
3a Web Aula - Gestão de Tecnologia da Informação.pdf3a Web Aula - Gestão de Tecnologia da Informação.pdf
3a Web Aula - Gestão de Tecnologia da Informação.pdf
Dimas Francisco
 
Relatório geral pi
Relatório geral piRelatório geral pi
Relatório geral pi
redesinforma
 

Similar a Introdução a arquitetura de sistemas com .NET (20)

Saa s software como serviço (slides)
Saa s   software como serviço (slides)Saa s   software como serviço (slides)
Saa s software como serviço (slides)
 
Teoria de Sistemas de Informação - Atividade: Tecnologia e SI
Teoria de Sistemas de Informação - Atividade: Tecnologia e SITeoria de Sistemas de Informação - Atividade: Tecnologia e SI
Teoria de Sistemas de Informação - Atividade: Tecnologia e SI
 
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on AzureTDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
 
Integração de software solucao e estilo
Integração de software   solucao e estiloIntegração de software   solucao e estilo
Integração de software solucao e estilo
 
Integração de software 2
Integração de software 2Integração de software 2
Integração de software 2
 
O desafio de sustentar centenas de servicos
O desafio de sustentar centenas de servicosO desafio de sustentar centenas de servicos
O desafio de sustentar centenas de servicos
 
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...
 
3a Web Aula - Gestão de Tecnologia da Informação.pdf
3a Web Aula - Gestão de Tecnologia da Informação.pdf3a Web Aula - Gestão de Tecnologia da Informação.pdf
3a Web Aula - Gestão de Tecnologia da Informação.pdf
 
Cursos
CursosCursos
Cursos
 
Relatório geral pi
Relatório geral piRelatório geral pi
Relatório geral pi
 
Introdução ao desenvolvimento da web.pptx
Introdução ao desenvolvimento da web.pptxIntrodução ao desenvolvimento da web.pptx
Introdução ao desenvolvimento da web.pptx
 
Informática para Internet - Aula 03
Informática para Internet - Aula 03Informática para Internet - Aula 03
Informática para Internet - Aula 03
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
 
DDD e Microsservicos - do negócio à arquitetura
DDD e Microsservicos - do negócio à arquiteturaDDD e Microsservicos - do negócio à arquitetura
DDD e Microsservicos - do negócio à arquitetura
 
Frameworks de desenvolvimento web
Frameworks de desenvolvimento webFrameworks de desenvolvimento web
Frameworks de desenvolvimento web
 
Desenvolvimento ágil de software: análise sintética a partir de KANBAN
Desenvolvimento ágil de software: análise sintética a partir de KANBANDesenvolvimento ágil de software: análise sintética a partir de KANBAN
Desenvolvimento ágil de software: análise sintética a partir de KANBAN
 
Cloud Computing
Cloud ComputingCloud Computing
Cloud Computing
 
DDD
DDDDDD
DDD
 
Desenvolvimento em Nuvem
Desenvolvimento em NuvemDesenvolvimento em Nuvem
Desenvolvimento em Nuvem
 
Analise e desenvolvimento
Analise e desenvolvimentoAnalise e desenvolvimento
Analise e desenvolvimento
 

Último

Último (6)

ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 

Introdução a arquitetura de sistemas com .NET

  • 1. Módulo 2: Introdução a arquiteturas modernas Integrante do curso Práticas modernas de desenvolvimento de software utilizando a plataforma .NET
  • 2. Introdução Este curso busca mostrar para o aluno uma visão ampla e um vocabulário mínimo para que seja possível prosseguir falando assuntos como Domain-Driven Design, Test- First Development e muito mais. Com este entendimento mínimo o aluno conseguirá ter base para conseguir analisar a arquitetura de um projeto moderno de mercado.
  • 3. Introdução • Este curso falará apenas de sistemas, isto é, programas feitos para resolver problemas de negócio. • Outros tipos de sistemas, como jogos ou softwares mais específicos também se utilizam de alguns conceitos básicos e universais que serão apresentados neste curso.
  • 4. Software em 2012 • Antigamente os sistemas eram menores. As ferramentas eram mais restritas e os times eram menores. As regras de negócio ficavam nas telas e o eventual acesso a banco de dados também ficava nas telas. • Este modelo de desenvolvimento torna o sistema extremamente mais difícil de manter, pois as responsabilidades acabavam por se misturar, aumentando o risco de se corrigir ou criar novas funcionalidades.
  • 5. Software em 2012 • Com o passar do tempo e com a evolução das ferramentas de desenvolvimento, as empresas acabaram notando que era possível entregar cada vez mais funcionalidades. • Entregar novas funcionalidades significa também, saber organizá-las de forma coerente. Entretanto, a comunidade sempre teve grande dificuldade em organizar o software de maneira decente. • Desde os anos 70 surgiram alguns pilares do software moderno como a orientação a objetos e a separação de responsabilidades entre as diversas partes do software.
  • 6. Software em 2012 • O padrão MVC acabou por se popularizar, espalhando pela comunidade também, a ideia de separação de responsabilidades entre modelo de dados, telas e controllers, que organizam o fluxo de telas.
  • 7. Software em 2012 • Este conceito, que é a separação de responsabilidades, funciona até hoje. É um pilar fundamental de qualquer software bem escrito. • A evolução das ferramentas, como a criação de IDEs mais completas, a modernização de linguagens de programação, a evolução dos sistemas operacionais e as fundamentais melhorias nas capacidades de exibir itens nas telas trouxe mudanças radicais de paradigmas no desenvolvimento de software: um novo mundo se apresentava para os desenvolvedores, que tinha que enfrentar desafios novos como a programação para Windows, utilização de mouse, ambiente multitarefas e mais. Esta evolução acabou aumentando radicalmente os graus de liberdade das aplicações então desenvolvidas.
  • 8. Software até 2012 • Este aumento de graus de liberdade dos sistemas aumentou proporcionalmente a complexidade do código gerado para suportar tudo isso. Novos problemas de manutenção de código começaram a aparecer. • Com a evolução dos sistemas operacionais tanto de desktop como de servidores, as empresas começaram a explorar novas possibilidades, como a troca de dados automatizada entre sistemas, aumentando novamente a complexidade do software produzido.
  • 9. Software até 2012 • O número de projetos fracassados, abandonados ou atrasados era alto. A comunidade ainda não estava pronta para trabalhar com coesão e simplicidade. • Com o passar do tempo e o surgimento de plataformas como Java e .NET, a comunidade estabeleceu um norte para conseguir organizar todo o código produzido e conseguiu padronizar alguns conceitos básicos.
  • 10. Software até 2012 • Além de ter havido um grande aumento de criação de software para desktops, o surgimento da internet para o grande público revolucionou também a forma de se construir software corporativo. O deploy de uma aplicação desktop sempre é um transtorno e a possibilidade de colocar cuidar de apenas um ambiente para realizar o deploy popularizou muito as aplicações web. • Porém, esta nova forma de criar sistemas ocasionou, novamente, uma nova geração de sistemas sem uma arquitetura decente.
  • 11. Software até 2012 • Os bancos de dados relacionais se tornaram padrão de mercado e inúmeros sistemas, de todos os tamanhos, passaram a utilizar bancos de dados como Oracle, SQL Server, MySQL e muitos outros. • A capacidade de centralizar a lógica de negócios em um único lugar fascinou muitos desenvolvedores, que conseguiram fazer com que os bancos de dados fossem responsáveis por uma grande parte da lógica de negócio da aplicação. Com isso, com a popularização de sistema de banco de dados, muitos sistemas contavam com uma quantidade brutal de código em procedures.
  • 12. Software até 2012 • A comunidade foi amadurecendo. Os times foram crescendo a necessidade de entregar valor foi crescendo. A lógica muito espalhada ou muito centralizada acabou por dificultar brutalmente a manutenção dos sistemas, fazendo com que estes muitas vezes fossem refeitos do zero. Lógica espalhada por cada página ou lógica centralizada no banco de dados torna a manutenção e a paralelização de tarefas árduas.
  • 13. Software até 2012 • A comunidade chegou ao conceito de separação de responsabilidades mais formal, trazendo à tona o conceito de aplicações em camadas e a necessidade de organizar as diferentes partes a aplicação de forma adequada. • Alcançando uma adequada organização do software de forma padronizada, grande parte da comunidade tem se beneficiado de uma forma inteligente, otimizada e universal de se desenvolver software.
  • 14. Conceitos Iniciais: Fluxo de dados • A maioria absoluta dos sistemas trabalham com dados. Uma forma simples de entender um sistema é analisando o caminho que a informação percorre dentro do sistema. Em geral, a informação é criada na camada de apresentação, processada pela camada de negócio e persistida em um banco de dados. E faz o mesmo caminho para retornar para o usuário.
  • 15. Conceitos Iniciais: Fluxo de dados • Conhecendo o caminho que a informação percorre no sistema, é possível compreender com facilidade como é a arquitetura do sistema.
  • 16. Conceitos Iniciais: Camadas • Ao desenhar o fluxo de dados da aplicação, a informação poderá passar por uma, duas ou máquinas do começo ao fim. Estas máquinas, onde a aplicação roda, são consideradas camadas físicas. Como exemplo de camadas físicas, podemos citar servidores web, servidores de aplicação, servidores de aplicação, celular, browser de um desktop, etc – a camada física é onde a aplicação fisicamente é executada. • Uma aplicação atual típica costuma ter um servidor web, um servidor de banco de dados e um browser rodando no desktop do usuário final.
  • 17. Conceitos Iniciais: Camadas • Ao desenhar o fluxo de dados da aplicação, a informação poderá passar por uma, duas ou várias máquinas físicas do começo ao fim. Estas partes, onde a aplicação roda, são consideradas camadas físicas. Como exemplo de camadas físicas, podemos citar servidores web, servidores de aplicação, servidores de aplicação, celular, browser de um desktop, etc – a camada física é onde a aplicação fisicamente é executada. • Uma aplicação atual típica costuma ter um servidor web, um servidor de banco de dados e um browser rodando no desktop do usuário final.
  • 18. Conceitos Iniciais: Camadas • Um sistema típico possui pelo uma camada de apresentação e uma camada de negócios e outra de acesso a dados (comumente conhecida por persistência). Estas camadas são chamadas de camadas lógicas. A camada lógica, ou simplesmente camada na visão do desenvolvedor, representa a separação básica de responsabilidade do software. Por exemplo, a camada de apresentação é responsável por toda a interação browser-servidor web, mecânica de tela, validação de entrada de dados e correlatos. Mesmo que a aplicação tenha uma versão web e outra mobile, ainda assim a aplicação só terá uma única camada de apresentação.
  • 19. Principais camadas • As principais camadas são: – Apresentação – Negócio / Serviços – Acesso a dados – Infraestrutura • Ao utilizar a plataforma .NET, é possível trabalhar utilizando C# na maioria das camadas da aplicação.
  • 20. Arquitetura 3 camadas • A maioria dos sistemas construídos desde a popularização da plataforma .NET utiliza a divisão em 3 camadas: apresentação, negócio e acesso a dados. • Este estilo de arquitetura é de longe o mais conhecido na comunidade. • Este padrão conseguiu fazer com que as empresas aumentassem as equipes, permitindo paralelismo de tarefas e aumentando a quantidade de software entregue. Este padrão fez bastante sucesso na comunidade e se tornou o padrão de projetos das consultorias e empresas. • Para suportar as necessidades atuais de software, o paradigma de aplicações 3 camadas acabou não sendo suficiente.
  • 21. Arquitetura N-Camadas • A arquitetura 3 camadas tradicional não atende aos novos requisitos de software, como por exemplo, a criação de software testável, orientado a domínio, flexível e simples de manter. • Quando se fala em N camadas, fala-se de múltiplas camadas lógicas, claras e bem definidas, que destrincham melhor as camadas do modelo 3- camadas. • A separação do software em responsabilidades ainda menores e mais bem definidas tem sido uma tendência mundial da comunidade.
  • 22. Camada de Apresentação • No mundo .NET, as camadas de apresentação têm evoluído de forma brutal nos últimos 5 anos. Hoje em dia a aplicação pode ser construída como: – ASP.NET Web Forms / ASP.NET MVC – Silverlight – WPF – Windows Forms – Console Application
  • 23. Camada de Apresentação • As aplicações web dominaram o mercado de software corporativo e um dos motivos do sucesso da plataforma .NET é a relativa facilidade em se construir aplicações web em pouco tempo. • Hoje em dia, com o ASP.NET MVC a maior facilidade para se trabalhar com código client-side, o desenvolvedor precisa conhecer Javascript, jQuery, HTML(5), CSS(2.1 e 3.0) e diversos frameworks e tecnologias auxiliares, como por exemplo, Ajax. Isto faz com que o desenvolvimento web seja desafiador, porém, muito interessante por ter uma abrangência quase universal – a maioria dos dispositivos modernos consegue processar aplicações web criadas com padrões atuais de HTML, Javascript e CSS.
  • 24. Camada de Apresentação • Com .NET, também há opções para ambientes que rodam somente Windows. Como a vasta maioria dos clientes corporativos utiliza o Windows como sistema operacional, há grandes chances de ser possível utilizar estas outras opções para construir sua aplicação. • A Microsoft oferece a possibilidade de trabalhar com dispositivos móveis utilizando a plataforma Windows 8, que compreende tablets, celulares e desktops. É possível criar Metro-style applications que suportam o .NET 4.5 e se utilizam uma versão nativa da tecnologia empregada no Silverlight e WPF: XAML. Outra vantagem de se criar apps para Windows 8 é que é possível programar tanto em C# quanto Javascript e C++. AS aplicações Metro rodam nativamente e não utilizam o .NET – elas utilizam o WinRT, que é uma atualização do Win32 e que suporta o mesmo estilo de bibliotecas do .NET.
  • 25. Camada de Negócios • As regras de negócio devem ficar no código fonte e não mais no banco de dados. As regras também não podem ficar armazenadas na tela. • A camada de negócios é responsável por orquestrar o acesso a recursos como banco de dados, webservices externos e é responsável também por retornar ao usuário a resposta de suas requisições. Vale notar que a aplicação é responsável por aceitar imediatamente as requisições do usuário e não necessariamente, precisa retornar a resposta da requisição imediatamente. A camada de negócios é o coração da aplicação em qualquer tipo de arquitetura.
  • 26. Camada de Acesso a Dados • Como dito anteriormente, quase todos os sistemas trabalham com dados. A camada de acesso a dados recebe comandos da camada de negócios e providencia acesso aos dados guardados no banco de dados. • Antigamente o código de acesso dados era muito tedioso, repetitivo e suscetível a erros. Basicamente, os desenvolvedores escreviam comandos SQL para operações CRUD e lógicas avançadas eram feitas chamando procedures. A comunidade acabou criando ferramentas chamadas OR/Ms - object-relational mapping. Estas ferramentas conseguem fazer com que a aplicação veja tabelas do banco de dados como classes, simplificando o código de acesso a dados em 90% - hoje em dia não é mais necessário montar comandos SQL dentro do código-fonte. Um OR/M consegue gerar comandos SQL automaticamente.
  • 27. Camada de Acesso a Dados • Os OR/Ms mais populares são: NHibernate e Entity Framework na comunidade .NET. Há muitos similares, pagos e gratuitos, mas geralmente só se pensa nestas duas opções ao criar escolher um OR/M. • O NHibernate é mais maduro e oferece uma maior gama de configurações para melhorar a performance da aplicação. • O Entity Framework tem recebido atualizações constantes da Microsoft – o seu ciclo de desenvolvimento não é atrelado às versões do .NET – ou seja – a Microsoft tem trabalhado com a comunidade para gerar versões mais rapidamente e focando no que a comunidade tem pedido.
  • 28. Camada de Acesso a Dados • O uso de LINQ é suportado pelas duas ferramentas – é possível montar consultas usando sintaxe parecida com SQL para gerar consultas no banco de dados. • Ambos suportam os bancos de dados mais comuns do mercado, como Oracle, SQL Server e MySQL. • A utilização de OR/M acelera bastante o desenvolvimento e desfavorece a colocação de lógica complexa no banco de dados – todos os dados que chegam do banco de dados precisam ser mapeados para uma classe da aplicação.
  • 29. Camada de Acesso a Dados • Nos últimos anos, uma nova tendência surgiu no mercado - a utilização de banco de dados NOSQL. • NOSQL é interpretado normalmente como “not only SQL” – na prática, isto significa que a tecnologia de persistência de dados não necessariamente é um banco de dados clássico, como SQL Server ou Oracle – hoje em dia há múltiplas classes de bancos de dados, que rompem completamente com o modelo relacional para serem bons em alguma área específica. • Com o uso de NoSQL, é possível criar aplicações extremamente rápidas, poderosas, flexíveis e fáceis de manter. Esta tendência está mudando radicalmente a forma de pensar no acesso a dados de uma aplicação moderna. • Ultimamente, provedores de serviços de storage e servidor na nuvem oferecem novas possibilidades de se trabalhar com informações de formas simples e com alta performance. Em 2012, as opções para construir software moderno são brutalmente mais abundantes que há 10 anos atrás.
  • 30. Camada de Serviços • Um sistema pode expor seus dados e sua lógica para o mundo externo sem precisar de uma camada de apresentação. Com isso, outros sistemas podem consumir estes dados. • A forma mais comum de trocar dados entre sistemas via intranet/internet é através da utilização de web services. • As trocas de dados entre sistemas precisam aderir a um padrão de formato de mensagem para que software construído em qualquer plataforma consiga consumir serviços de outra plataforma qualquer. • O crescimento da internet e a popularização de tecnologias como SOA e REST faz com que a camada de serviços da aplicação hoje em dia seja muito mais complexa, pois ela pode ter que lidar com problemas de segurança, cache, operações de longa duração, uso de múltiplos servidores de aplicação entre outros tipos de desafios.
  • 31. Camada de Serviços • Os serviços expõem dados utilizando XML ou JSON. O uso de XML é comum em aplicações corporativas, que exigem um formato de dados rígido que também está no mercado há mais tempo. Aplicações modernas para a internet aberta são construídas utilizando JSON, que é um formato de dados mais simples, leve, flexível e fácil de se trabalhar com Javascript e demais frameworks de mercado. • A utilização de serviços mais simples, que trabalham com JSON é o padrão para aplicações mobile e AJAX – estas dependem de tráfego de dados otimizado para situações de internet lenta e intermitente.
  • 32. Camada de Infraestrutura • Os sistemas geralmente dependem de outras coisas para trabalhar. É raro encontrar uma aplicação que só tenha as três camadas básicas. Serviços de e-mail, log, segurança e correlatos são considerados parte da camada de infraestrutura – estes podem ser utilizados por qualquer outra camada.
  • 33. Arquiteturas orientadas a dados • Uma parcela enorme dos sistemas que estão no ar e mesmo os que estão construídos foram pensados utilizando o conceito de modelo de dados. • Neste modelo, as tabelas e seus relacionamentos guiam toda a arquitetura da aplicação. As entidades da aplicação são as mesmas entidades do banco de dados. • Embora bem sucedido até para projetos maiores, a sociedade notou que a manutenção destes sistemas acaba sendo muito cara – mudanças simples como adição de uma coluna provocam alterações em múltiplas classes. • Para aplicações simples, muitas vezes a camada de negócios não faz absolutamente nada – este fato é muitas vezes faz com que o desenvolvedor iniciante pense que é inútil ter uma camada de negócios.
  • 34. Arquiteturas orientadas a dados • Muitas empresas criaram geradores de código para “automatizar” a produção de um código em geral muito repetitivo. Logo, a alteração do código gerado provoca outro custo de manutenção. Este problema é suavizado com a utilização de um OR/M. • Para o desenvolvimento orientado a dados, o banco de dados passa a ser o centro de gravidade da aplicação – o resto da aplicação serve apenas de ferramenta para cadastrar e utilizar informação. • O desenvolvimento orientado a dados não favorece a testabilidade do sistema – geralmente é muito difícil testar a lógica de negócios do sistema de forma isolada – a maioria dos testes viáveis acabam de alguma forma tocando o banco de dados, tornando-se testes de integração mais lentos. • O código gerado por uma arquitetura destas não é orientado a objetos. Este tipo de sistema é simplesmente uma sequência de procedimentos para escrever no banco de dados.
  • 35. Arquiteturas orientadas a domínio • Como uma resposta aos efeitos colaterais das arquiteturas orientadas a dados, a comunidade trouxe à tona o DDD (Domain-Driven Design) • Esta metodologia é uma mudança dura e brutal de paradigma – o banco de dados deixa de ser o centro da aplicação. • O domínio, isto é, o problema que a aplicação resolve vira o centro de gravidade da aplicação. Esta mudança faz, na prática, que o banco de dados fique no mesmo nível de outros serviços – é apenas um item que o domínio utiliza para resolver o problema de negócios.
  • 36. Arquiteturas orientadas a domínio • O DDD é uma forma mais complexa de se desenvolver software. Entretanto, esta metodologia é focada na construção de sistemas que sejam orientados a objetos, fáceis de manter, fáceis de testar e com responsabilidades muito bem definidas. Ou seja: há uma trade- off entre esforço de desenvolvimento e custo de manutenção no futuro. Para empresas com produtos próprios e duradouros, faz muito sentido pensar na aplicação de DDD e suas técnicas. • O DDD traz consigo muitas práticas interessantes de desenvolvimento de software, como TDD (Test-Driven Development) e o desenvolvimento ágil. Com isso, só se constrói software que realmente será utilizado pela aplicação final, nem mais nem menos. O código produzido com TDD tende a ser muito mais legível, simples e focado em trazer resultados mais concretos e óbvios. • O código orientado a domínio é orientado a objetos e tende possuir um acoplamento muito inferior ao visto nos sistemas orientados a dados.
  • 37. Exemplo: Arquitetura 3 camadas focada no banco de dados Apresentação Legenda: O projeto A utiliza o projeto B Infraestrutura Negócio A B Acesso a dados
  • 38. Exemplo: Arquitetura n-camadas focada em domínio
  • 39. Organização da camada de apresentação • Ao iniciar um projeto do zero, além de decidir quais camadas e qual metodologia será utilizada, é necessário, entre várias outras decisões, estabelecer como será a estrutura da camada de apresentação. • Esta decisão é importante pois pode ser a diferença entre ter um projeto simples ou complexo de manter.
  • 40. Organização da camada de apresentação • Algumas tecnologias, como Windows Forms e ASP.NET Web Forms permitem as criação de arquivos code-behind. Este arquivo é necessário para que seja possível responder a eventos como click, double- click e também, eventos de componentes. Este tipo de código é orientado a eventos e tende causar um enorme acoplamento tela-regra de negócio, pois todas as ações são tomadas utilizando eventos de tela.
  • 41. Organização da camada de apresentação • O uso de code-behind prejudica a testabilidade de código. Regras de negócio misturadas com eventos de tela é a receita perfeita para criar sistemas impossíveis de manter. • A maior parte dos novos desenvolvedores simplesmente não entende a motivação do código existente. Logo, código recém- criado acaba piorando mais ainda a situação, levando o sistema a um caos.
  • 42. Organização da camada de apresentação • Para trazer sanidade ao desenvolvimento do front-end, a comunidade criou vários padrões estruturais adequados para cada cenário. São eles: – MVC – Model-View-Controller – MVP – Model-View-Presenter – MVVM – Model-View-ViewModel. • Basicamente estes padrões servem para trazer uma separação básica entre a lógica que manipula a tela, dados que alimentam a tela e os fluxos da aplicação.
  • 43. Organização da camada de apresentação • A View é o que aparece na tela em si. No mundo do .NET temos: - ASP.NET Web Forms -> .aspx - ASP.NET MVC -> .cshtml - Silverlight/WPF -> .xaml - Windows Forms -> um Form simples - Das citadas acima, só o ASP.NET não permite code-behind – mas permite código inline no HTML.
  • 44. Organização da camada de apresentação • O Controller, Presenter ou ViewModel é responsável por servir de elemento intermediário entre a View e os dados da aplicação. • Esta intermediação ajuda a deixar a View limpa, permitindo que a View só se preocupe em mostrar os dados vindos do sistema e claro, consiga fazer o trabalho de aceitar um input válido do usuário final. • A comunicação Controller para View tem evoluído muito no mundo .NET. O sistema de binding do WPF, MVC e até mesmo Web Forms (.NET 4.5) trouxe uma grande facilidade de se aplicar databinding neste processo de passar dados, diminuindo brutalmente a quantidade de código tedioso necessário para alimentar uma view.
  • 45. Organização da camada de apresentação • A definição de Model hoje em dia é relativamente turva. O Model, tecnicamente falando, é a classe do .NET que o Controller usa para alimentar a View com dados. • Muitas aplicações não possuem classes específicas para representar os dados de uma tela – por praticidade algumas equipes utilizam as próprias classes de domínio para fazer o binding na view. Nestes casos, o Model passa a ser o domínio da aplicação.
  • 46. Boas práticas • Primordial: sempre que for iniciar uma aplicação séria, com múltiplas telas e fluxos, utilize DDD e TDD. O mercado cada vez mais glorifica os benefícios destas técnicas, que vão em consonância com metodologias ágeis de desenvolvimento de software que norteiam a comunidade hoje em dia. • As boas práticas descritas daqui em diante precisam ser avaliadas – o custo e o benefício podem variam em cada caso.
  • 47. Boas práticas • Para diminuir o acoplamento entre as camadas, utilize Dependency Injection. Este padrão faz com que cada classe receba pronta toda as suas dependências, sem se preocupar em criar instâncias das mesmas. • Ao passar dados entre as camadas, utilize classes específicas para este fim. Sempre que possível, crie um DTO (Data Transfer Object) para passar os dados. Considere passar somente dados estritamente necessários para atender a requisição. Utilize uma ferramenta para fazer o mapeamento automático em todas as situações.
  • 48. Boas práticas • O mesmo vale para as camadas de apresentação. Uma forma comum de se trabalhar é utilizando ViewModels, que são classes que possuem só e somente só os campos que a View vai utilizar. Mesmo que uma entidade principal do domínio se pareça muito com o modelo de uma view, ainda assim compensa criar uma ViewModel – há um ganho de liberdade para poder evoluir em separado o código da ViewModel sem afetar o domínio. E vice-versa. Em geral, utilize uma ViewModel por View. • Quando o domínio da aplicação deve depender apenas de interfaces que representam o recurso a ser utilizado. Estas interfaces (sim, interfaces do C#) funcionam como contratos nos quais o domínio pode confiar para por exemplo, enviar um e-mail, utilizar um banco de dados e etc. Esta técnica diminui bastante o acoplamento entre as partes da aplicação. Outra vantagem é que o uso desta técnica permite a substituição de um recurso externo por um objeto falso. Este aumento de facilidade ao testar é fundamental para gerar um código mais bem escrito e decente. Por exemplo, é possível criar um teste que use dados falsos de um banco de dados falso para exercitar uma lógica de domínio. Estes objetos fajutos implementam a mesma interface do recurso real, o que para o domínio da aplicação é transparente.
  • 49. Boas práticas • Crie testes unitários e de integração. Utilize ferramentas como NUnit e Moq para ajudar a automatizar os testes unitários. Não construa testes unitários que toquem o banco de dados – a velocidade tende a cair muito. Utilize test doubles sempre que possível. • Utilize ferramentas open-source em seu projeto. Um aplicação moderna depende de múltiplos frameworks e projetos que automatizam e simplificam processos repetitivos e braçais. Utilizando ferramentas de terceiros com código aberto, é possível cogitar na possibilidade de alterar a implementação da ferramenta.
  • 50. Boas práticas • Ao optar por design patterns de UI, pense nos seguintes padrões: – ASP.NET Web Forms: utilizar MVP – Windows Forms: utilizar MVP – ASP.NET MVC: utilizar MVC – Silverlight, WPF: utilizar MVVM