Mostrar mensagens com a etiqueta MVC. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta MVC. Mostrar todas as mensagens

sábado, 7 de março de 2015

Conceitos de Programação e Arquitectura de Software (I)

Introdução

Hoje em dia a complexidade dos sistemas de software, exige a sua concepção e desenvolvimento obedeçam a regras criteriosas, à utilização das tecnologias e técnicas mais adequadas e à aplicação de boas práticas.

Um dos pontos chave para atingir o objectivo de criar bons sistemas é a Arquitectura de Software.

Mas o que é isso da Arquitectura de Software? E as técnicas? E as boas práticas?

O objectivo desta série de artigos é dar resposta a estas e muito mais perguntas, sistematizando, de forma clara e sucinta, um conjunto de conceitos base sobre arquitectura e desenvolvimento de software, para novos programadores.

O artigo foca-se na Programação Orientada a Objectos (POO) e os exemplos apresentados foram desenvolvidos na linguagem C#, da plataforma Microsoft .NET, mas os conceitos são aplicáveis a qualquer outra tecnologia ou linguagem.

Conteúdo

1. Arquitectura de Software

1.1. O que é a Arquitectura de Software?

A Arquitectura de Software corresponde ao processo de de criar uma solução estruturada que responda a todos os requisitos técnicos e operacionais do sistema. Consiste na estrutura, ou estruturas de alto nível do sistema, às regras, procedimentos heurísticos e padrões para criar tais estruturas e à documentação dessas estruturas.

“As estruturas do sistema compreendem elementos de software, as propriedades desses elementos, visíveis do exterior e as relações entre eles. A arquitectura preocupa-se com a parte pública dos interfaces, os detalhes privados dos elementos de software – aqueles que dizem respeito apenas à implementação – não são arquitecturais.”
-- Bass, Clements e Kazman
”Software Arquitecture in Practice” (3ª edição)

A arquitectura de software NÃO É um conjunto ou uma pilha de tecnologias (entenda-se aqui tecnologias como as ferramentas, técnicas e APIs usadas para construir o sistema).

No mundo da programação, quando alguém pergunta como vamos arquitectar uma dada aplicação, muitas vezes dizemos, por exemplo, que vamos construir um sistema baseado em “ASP.NET MVC 4, com uma camada de serviços WCF, em cima duma framework e os dados são guardados numa BD do SQL Server”. Isto é uma pilha de tecnologias, mas não nos descreve como vai ser o sistema. É como se perguntássemos qual a arquitectura de um edifício e nos dissessem que é feito com tijolos, cimento e que vão ser usadas betoneiras e colheres de pedreiro para o construir.

1.2. Porque é importante a Arquitectura de Software?

A arquitectura de um sistema define as grandes decisões a serem tomadas.

Primeiro temos que identificar os requisitos do sistema, que pode ser de diferentes tipos.

Como podemos ver, nem todos os requisitos são compatíveis entre si. Então, temos que tomar decisões que garantam que o sistema está equilibrado - que corresponde aos objectivos para que foi desenhado, dentro do ambiente onde vai ser executado.

Em resumo, a arquitectura de software é importante porque:

  • Controla a complexidade
  • Força a aplicação das melhores práticas
  • Dá consistência e uniformidade
  • Aumenta a previsibilidade
  • Permite a reutilização

1.3. Quais os objectivos da Arquitectura de Software?

O principal objetivo da arquitectura de software é identificar os requisitos que afectam a estrutura do sistema. A arquitectura procura construir uma ponte entre os requisitos de negócio e os requisitos técnicos, através da compreensão dos Casos de Uso e da definição de formas de implementar esses casos de uso no software.

Lembrar que a arquitectura deve:

  • Expor a estrutura do sistema, mas esconder os detalhes de implementação
  • Identificar todos os casos de utilização e cenários
  • Tentar dar resposta aos requisitos de vários intervenientes (stakeholders)
  • Tratar dos requisitos funcionais e de qualidade

1.4. Arquitecturas por camadas

1.4.1. O que é a arquitectura de 2 camadas (2-tier)?

A arquitectura de 2 camadas refere-se ao modelo cliente/servidor, termo que começou a ser usado na década de 1980, referindo-se a computadores pessoais ligados em rede. O modelo cliente/servidor real começou a ganhar aceitação no final de 1980 e mais tarde foi adoptado para a programação Web.

imageActualmente, na utilização da arquitectura de 2 camadas, os interfaces do utilizador (UI) (p.ex. todas as páginas Web, numa aplicação para Internet) são executados no cliente e a Base de Dados (BD) é armazenada no servidor. A lógica da aplicação pode ser executada no cliente ou no servidor. Portanto, neste caso, o UI vai aceder diretamente à BD. Os clientes também podem ser motores de processamento (e não de interface), que fornecem soluções para outros sistemas remotos ou locais.

Em qualquer dos casos, hoje em dia, o modelo de 2 camadas é preterido em relação ao modelo de 3 camadas. A vantagem de um sistema de 2 camadas é a sua simplicidade, mas a simplicidade tem o custo da escalabilidade. A arquitectura de 3 camadas (mais recente) introduz uma camada intermédia, para a lógica da aplicação.

1.4.2. O que é a arquitectura de 3 camadas (3-tier)?

A arquitetura de 3 camadas surgiu na década de 1990 com o intuito de superar as limitações da arquitetura de 2 camadas. Esta arquitectura tem sido intensivamente adoptada e aperfeiçoada pelos modernos projectistas e programadores de sistemas Web.

O modelo de 3 camadas é uma arquitetura cliente/servidor em que o UI, a lógica funcional, o armazenamento de dados e o acesso aos dados são desenvolvidos e mantidos como módulos independentes (algumas vezes até em plataformas distintas). O termo "três camadas" ou "três níveis" (3-layer), bem como o conceito de arquitecturas multi-camada, parece ter sido originado a partir do Software Rational.

image

A arquitetura de 3 camadas, classicamente, tem os seguintes níveis:

  • Camada de apresentação ou de servidor Web: Interface do Utilizador, que exibe os dados para ou aceita inputs do utilizador (ver detalhes abaixo).
  • Camada de Lógica de Negócio/Aplicação ou Servidor Aplicacional: Validação e aceitação dos dados antes de guardar na BD, processamentos, cálculos e todas as outras operações específicas do negócio/aplicação (ver detalhes abaixo).
  • Camada de Dados ou Servidor BD: Simples operações de leitura e escrita de dados na BD ou em qualquer outro sistema de armazenamento (ver detalhes abaixo).

1.4.3. O que é a Data Access Layer (DAL)?

A Camada de Acesso a Dados (DAL) consiste principalmente num conjunto simples de código que efectua as interações básicas com a BD ou qualquer outro dispositivo de armazenamento de dados. Estas funcionalidades são muitas vezes referidos como CRUD (Create, Retrieve, Update, Delete).

A DAL deve ser genérica, simples, rápida e eficiente. Não deve incluir lógica de negócio/aplicação complexa. Muitos sistema têm longas e complexas Stored Procedures (SP), que são executadas para uma simples operação de leitura de dados. Estas SP contém, muitas vezes, lógica de negócio, lógica da aplicação e lógica de UI também. Se uma SP estiver a ficar muito longa, isso é sinal de que está a colocar a lógica de negócio na DAL.

1.4.4. O que é a Business Logic Layer (BLL ou BL)?

Ao lermos a imensa documentação disponível sobre este tema, percebemos que nem todos os autores concordam com o que é a Camada de Lógica de Negócio (BL). Em muitos casos é apenas uma ponte entre a Camada de Apresentação e a Camada de Dados, sem qualquer função adicional que não seja passar dados de uma lado para o outro. No entanto, nada nos impede de alterar a abordagem a este tipo de BL. Mas a mudança deve ser feita como e quando se sentir confortável de que o método a aplicar é flexível o suficiente para suportar o crescimento do sistema. Existem muitas maneiras excelentes de implementar a BL, mas tenha cuidado ao selecioná-las, pois podem complicar em excesso um sistema simples. É um equilíbrio que é preciso encontrar com base na sua experiência.

Como recomendação geral, deve decidir como mapear os dados das tabelas para Entidades de Negócio (classes) correctamente definidas. As entidades de negócio devem levar em consideração os vários tipos de requisitos e funcionamento do sistema. Pode-se usar uma abordagem de definir uma entidade separada para cada tabela da BD (a maioria dos ORMs levam a isto), mas recomenda-se a criação de entidades que permitam encapsular as exigências funcionais e de UI da aplicação, que podem ser autónomas ou, por exemplo, agregar várias entidades relacionadas com as tabelas da BD.

1.4.5. O que é a Presentation Layer (PL ou UI)?

A Camada de Apresentação ou Interface com o Utilizador (UI), como o nome indica, interage directamente com o utilizador. Tipicamente é constituída por um ambiente gráfico composto por variados objectos (controlos) que permitem ao utilizador interagir com o sistema, quer através da introdução e visualização de dados, quer através da realização de acções e introdução de comandos.

1.5. Algumas Arquitecturas populares

1.5.1. O que é a Arquitectura MVC?

A arquitetura Model-View-Controller (MVC) separa a modelagem do domínio, a apresentação e as ações baseadas nos inputs do utilizador (lógica de apresentação) em três classes distintas.

Infelizmente, a popularidade deste modelo resultou em alguns usos defeituosos. Cada tecnologia (Java, ASP.NET, etc.) definiu-o da sua própria maneira, fazendo com que seja difícil de entender. Em particular, o termo "controlador" tem sido usado para significar coisas diferentes em contextos diferentes. As definições abaixo estão o mais próximo possível da tecnologia ASP.NET MVC.

  • Model: conjunto de classes que criam um modelo do sistema, usado para apresentar os dados ao utilizador. Podemos ter entidades de negócio, coleções, DataSets, etc.
  • View: ficheiro de página Web (HTML, Javascript) que se encarrega de implementar o UI.
  • Controller: classe que recebe os pedidos e eventos despoletados pelas acções do utilizador na View.

Num sistema distribuído de n camadas, a arquitetura MVC tem o papel vital de organizar a Camada de Apresentação.

Recomenda-se a consulta do artigo “ASP.NET MVC vs ASP.NET Web Forms – Porquê o MVC?” para maior detalhe nos conceitos desta arquitectura.

1.5.2. O que é a Arquitectura SOA?

A Arquitetura Orientada a Serviços (SOA) é  um modelo de programação em que as funcionalidades das aplicações são disponibilizadas como serviços, que utilizam o paradigma pedido/resposta para estabelecer a comunicação entre os sistemas clientes e os sistemas que implementam os serviços.

A SOA é essencialmente uma coleção de serviços, que comunicam uns com os outros e com os sistemas clientes. A comunicação pode envolver a simples passagem de dados ou pode envolver dois ou mais serviços na coordenação de alguma atividade.

Com o desenvolvimento das aplicações baseadas em Web, a utilização de Web Services tornou-se popular, tendo-se assistido a uma proliferação dos sistemas SOA. Todavia há que salientar que um serviço não é necessariamente um web service, nem tem que estar relacionado com a Web.

A SOA pode ser ainda usada como o conceito para conectar vários sistemas de prestação de serviços. Esta arquitectura tem um grande quinhão de participação no futuro do mundo das TI.

Referências

- MSDN Patterns & Practices
- Microsoft Application Architecture Guide
- Code Project - Introduction to Object Oriented Programming Concepts (OOP) and More
- Learn Visual Studio.NET - Application Architecture Fundamentals

      domingo, 26 de outubro de 2014

      ASP.NET MVC vs ASP.NET Web Forms – Porquê o MVC?

      Introdução

      Conforme já tínhamos apresentado em artigo anterior, a tecnologia ASP.NET MVC foi introduzida pela Microsoft, na Framework .NET, em 2009.

      Se repararmos, nos últimos anos, o foco da Microsoft tem sido o MVC, MVC e MVC. Então a questão que se coloca é porque razão a Microsoft está tão interessada em abandonar uma tecnologia bem sucedida como as ASP.NET Web Forms e persuadir a comunidade de desenvolvimento Web a adoptar o ASP.NET MVC?

      Não me interpretem mal, existem milhares e milhares de aplicações baseadas em ASP.NET Web Forms que necessitam de suporte e evolução e esta tecnologia continua a existir no ecossistema da Framework .NET. Continuamos a poder criar novas aplicações baseadas em Web Forms. A questão é perceber se esta continua a ser a melhor opção.

      Conteúdo

      Desambiguação

      Antes de iniciarmos a abordagem ao tema proposto, convém fazer uma pequena desambiguação. Para muitos programadores, o ASP.NET é diferente do MVC, o ASP.NET é uma tecnologia antiga, enquanto o MVC é a novidade. Não é bem assim, o ASP.NET e o MVC não são coisas distintas. O MVC faz parte do ASP.NET.

      O ASP.NET é a framework Web da Microsoft. O MVC é um modelo de programação, construído em cima do ASP.NET. O que podemos classificar como antigo, em relação ao MVC, é o modelo de programação das Web Forms.

      image

      Podemos confirmar esta situação ao criar uma nova Aplicação Web no Visual Studio:

      As Web Forms e o MVC são apresentados como dois modelos (templates) de desenvolvimento de uma aplicação ASP.NET.

      A vitória das ASP.NET Web Forms

      Uma das principais razões para a rápida adopção do ASP.NET foi, sem dúvida, o facto de se tratar de uma abordagem RAD ao desenvolvimento Web. Com as Web Forms, a Microsoft, basicamente, estendeu o modelo de programação do Visual Basic, para a Web, permitindo a utilização de técnicas de drang-and-drop e de point-and-click, comuns no desenvolvimento para Windows. O modelo das Web Forms abstraía uma série de funcionalidades para apresentar uma simulação do modelo stateful (com estado) do Windows, aos programadores Web. Como resultado, não é necessário ser um especialista, com um profundo conhecimento de HTML e Javascript, para conseguir criar aplicações Web eficazes.

      Podemos resumir algumas das vantagens das ASP.NET Web Forms:

      Controlos Servidor ricos

      Quando se trabalha com HTML puro, as coisas não são sempre as mesmas em todos os lugares, como já deve ter notado. Um UI que parece óptimo no IE pode ficar distorcido no Firefox ou vice-versa.

      Um controlo de servidor ASP.NET detecta o navegador Web e gera o HTML adequado e, se necessário, Javascript também.

      Muitos controlos de servidor como o GridView e o ListView possuem recursos de data-binding, que permitem a redução de muitos esforços e a escrita de muito código.

      Suporte de ViewState

      Já deve ter lido várias vezes que "o HTTP é um protocolo sem estado (stateless)". Os controlos não mantém os seus valores entre Requests. Para simular a programação stateful, as Web Forms introduziram funcionalidades como o viewstate e postbacks. O último estado conhecido de todos os controlos é guardado na própria página, na forma de um campo oculto chamado ViewState.

      O code-behind

      Quando está a desenvolver uma aplicação web, o programador faz drag-and-drop dos controlos no designer da form e o Visual Studio cria o código por trás (code-behind). Enquanto o programador ajusta visualmente o layout da web form, actuando no ficheiro aspx, o código é colocado numa classe parcial, num ficheiro aspx.cs (ou aspx.vb).

      Estes ficheiros de code-beind foram a chave para o sucesso do desenvolvimento e entregas mais rápidas das aplicações baseadas em ASP.NET Web Forms. Os programadores puderam-se abstrair de muitos detalhes técnicos, como eventos, protocolo HTTP, POST, GET, gestão de sessão, etc.

      Programação baseada em Eventos

      Com a ajuda de:

      •  code-behind
      • Mecanismo de postback (fazer post de volta à mesma página)
      • ViewState

      a Microsoft introduziu a programação baseada em eventos (event-driven) no mundo da Internet.

      O programador já não necessita usar métodos POST e GET para lidar com as interações do utilizador com o servidor. Basta arrastar um controlo (p.ex. um botão) para a página, clicar duas vezes sobre o mesmo e é gerado um bloco de código para a manipulação do evento clique no servidor.

      Eram precisamente estas características que, anos antes, os programadores de páginas ASP procuravam. Além disso, as ASP.NET Web Forms até conseguiram superar essas expectativas, fornecendo uma camada de abstração total em cima de toda a pilha Web: Javascript, CSS, HTML.

      Menor esforço de aprendizagem

      Com a utilização de controlos de servidor ricos, o ViewState e eventos, conforme já afirmamos acima, não é necessário ser um especialista, com um profundo conhecimento de HTML e Javascript, para conseguir criar aplicações web eficazes.

      Os problemas das ASP.NET Web Forms

      Já vimos que o code-behind foi a principal razão do sucesso das Web Forms, mas a forma como é posicionado e invocado, provoca alguns problemas sérios. Vamos então analisar alguns destes problemas e depois vamos ver como a evolução para o MVC ajuda a lidar com os mesmos.

      Arquitectura do projecto

      Não existe uma Arquitectura de Projecto predefinida para aplicações Web baseadas em Web Forms. Os programadores têm total flexibilidade para escolher a sua própria arquitectura.

      Pode-se usar a arquitectura base de 3 camadas, dividindo o sistema em UI, Camada de Negócio e Camada de Acesso a Dados ou um modelo mais avançado como o Model-View-Presenter. Mas muitos programadores acabam por escolher usar apenas o code-behind e escrevem lá todo o código da aplicação, o que não é de todo considerado uma boa prática. O code-behind está fortemente acoplado ao UI, acabando sempre por ter uma lógica de apresentação e não de negócio ou acesso a dados.


      Solução baseada em Views (view-based) para requisitos baseados em Acções

      Os websites existem para os utilizadores finais. Os utilizadores chegam a um website com um propósito específico e comunicam esse propósito por acções. P.ex., numa rede social, o utilizador comunica os seus propósitos através de acções como:

      • Partilhar imagem
      • Escrever comentário
      • Enviar mensagem

      Estas acções são comunicadas através de cliques do rato, ou do URL no browser. Devido a esta estrutura baseada em acções, foi escolhido o protocolo HTTP para a Web, porque tem acções como GET, POST, PUT, DELETE, etc. que comunicam as intenções do utilizador de uma forma mais clara. Se conseguirmos mapear estas acções para métodos ou funções do nosso programa, faz mais sentido e mantém a arquitectura mais simples.

      Mas as ASP.NET Web Forms tinham um problema, queriam manter o conceito RAD, implementado através da programação visual e por isso acabaram por oferecer uma solução baseada em Views (view-based), para uma estrutura baseada em Acções (action-based).

      A arquitectura, em si, não está adaptada, do ponto de vista lógico, à abordagem baseada em acções, do utilizador final. Dito de outra forma, se um utilizador envia uma acção “Compra”, primeiro ela chega a uma view como “Loja.aspx” que, por sua vez, chama a “Loja.aspx.cs”, que executa um ciclo complexo (page life cycle) que, finalmente, executa a acção que responde ao pedido do utilizador.

      Isto é bastante confuso. Os pedidos são mapeados para uma acção real apenas depois de se completar um complexo ciclo da página.

      Efeitos secundários de uma má arquitectura – Alto Acoplamento

      Quando se começa com uma arquitectura incorrecta, acaba-se por fazer ajustes que vão provocar efeitos secundários graves. É o que acontece neste caso. O code-behind que pode parecer ser fisicamente diferente, colocado num ficheiro à parte, nunca foi, na verdade, desacoplado, i.e. o ficheiro aspx.cs (ou aspx.vb) nunca pode ser separado do respectivo ficheiro aspx.

      Por outras palavras, não é fácil anexar o código “Cliente.aspx.cs” à viewDetalhesCliente.aspx”. O code-behind está intimamente ligado à view. Não é reutilizável.

      O HTML não é o único tipo de resposta 

      Por causa da forte ligação entre a view e o code-behind, até mesmo o tipo de resposta é fixo nas Web Forms – HTML por defeito. Se desejar alterar o tipo de resposta, terá que lidar com tipos de conteúdo e métodos "Response.End", o que é complexo e trabalhoso.

      Combinação de View e dados 

      Quando enviamos uma resposta a um utilizador, esta é uma combinação de view (display) e de dados (modelo). Como as Web Forms são uma arquitectura view-first, é a view que vai decidir qual o modelo a conectar, o que a torna pouco flexível, para além de estarmos a envolver a view em tomadas de decisão complexas. Isto viola claramente o princípio SRP (SOLID) (pode ler mais sobre os Princípios SOLID aqui).

      Fazer do code-behind uma classe normal para Testes Unitários 

      O code-behind de uma Web Form é tipicamente uma classe parcial volumosa e pesada, que não pode ser instanciada através de código simples. Lembre-se que o ecran da Web Form herda da classe "System.Web.UI.Page". Esta classe de página não podem ser criada diretamente, pois tem muitas dependências.

      public partial class WebForm1 : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
          }

          public void Button1_Click(object sender, EventArgs e)
          {
              Session["SomeSession"] = "Is this set";
          }
      }

      Podemos agora perguntar por que razão queremos instanciar directamente esta classe de página. Bem, um lugar onde eu gostaria de a instanciar seria para realizar Testes Unitários. Gostaria de invocar as acções do método Click do botão e testar se as variáveis de sessão são definidas correctamente, se o estado da view está correcto, etc.

      Mas se tentar criar um método de teste para esta classe, vai acabar com um código semelhante ao mostrado abaixo.

      [TestMethod]
      public void TestMethod1()
      {
          WebApplication1.WebForm1 obj = new WebApplication1.WebForm1();

          obj.Button1_Click(this, new EventArgs());
      }

      Para além de ser um pouco estranho, quando o código do teste for invocado vai pedir mais coisas e gerar erros que tornam os testes unitários do UI impossíveis de realizar.

      Performance

      O ViewState é uma solução para alguns dos problemas das ASP clássicas, mas também se torna um problema em si próprio. O ViewState é armazenado na própria página pelo que tem que ser passado do cliente para o servidor e de novo do servidor para o cliente em cada acção de GET ou POST. Estamos a passar mais e mais dados, o que provoca uma visível degradação da performance.

      Menor controlo sobre o HTML gerado

      Nas Web Forms, muitas vezes não sabemos exactamente que HTML é gerado, tornando a integração com frameworks Javascript, como o jQuery, numa tarefa difícil.

      SEO (Search Engine Optimization)

      Os URLs apontam para páginas ASPX fixas que podem ainda ser decoradas com uma string de consulta. Eles não são, obviamente, user-friendly e afetam o SEO.

      Desenvolvimento paralelo

      A página ASPX está intimamente ligada ao code-behind. Logo não é possível ter dois programadores diferentes a trabalhar na mesma secção (um no aspx e o outro no code-behind) em simultâneo.

      ASP.NET 4.0

      Em 2010, a Microsoft lançou a nova versão ASP.NET 4.0, que inclui algumas boas características para superar alguns dos problemas acima:

      • ViewState: permite desabilitar ou controlar o tamanho do ViewState (mas não há nenhuma regra ou obrigatoriedade de o fazer);
      • URL Routing: passamos a poder fornecer o nosso próprio URL em vez do caminho físico da página;
      • ID: No ASP.NET 4.0 temos maior controlo sobre o Id dos elementos e, assim, a integração com uma framework Javascript tornar-se mais fácil. (mas ainda não temos o controlo completo sobre HTML que é gerado).

      Mesmo após a evolução das características revolucionárias do ASP.NET:

      • Ainda não foi possível resolver os problemas com os Testes Unitários;
      • É quase impossível encontrar um programador de ASP.NET Web Forms que tenha desabilitado o ViewState;
      • Temos algum controlo sobre o Id dos elementos, mas não o controlo completo sobre o HTML gerado, mantendo-se o problema de implementar Javascript.

      As vantagens do ASP.NET MVC

      O ASP.NET MVC é mais uma framework de desenvolvimento Web da Microsoft, desenhada com a separação de conceitos e testabilidade em mente. Está construída sobre o CLR e completamente baseada no Padrão MVC. Por isso pensamos em termos de controladores e views.

      O ASP.NET MVC não tem suporte para ViewState nem controlos de servidor, de modo que se sente um pouco da “velha” Web por aqui.

      Vejamos algumas das vantagens do ASP.NET MVC:

      Arquitectura do projecto

      Uma das grandes vantagens de usar ASP.NET MVC é que impõe a separação de conceitos. Portanto, há muito menos hipóteses de tornar as coisas demasiado complexas ou fortemente acopladas.

      Solução baseada em Acções (action-first)

      Como vimos anteriormente, as Web Forms implementam uma arquitectura baseada em Views (view-first). Então como podemos transformá-la numa arquitectura orientada por acções em vez de orientada por views?

      Que tal chamar primeiro a Acção e depois a acção escolhe a view? Faria com que o fluxo fosse mais lógico e claro. Isto é exactamente o que a arquitectura do MVC faz. A primeira chamada chega a uma Acção, que pertence a um Controlador e o controlador chama a View com o Modelo apropriado.

      Baixo Acoplamento

      A nossa arquitectura baseada em acções, permite-nos reutilizar o código duma acção em diferentes views. Por exemplo, se um utilizador enviar a acção “Display”, pode ser exibida a view DispalyDesktop.aspx” ou a viewDisplayMobile.aspx”, dependendo do tipo de dispositivo usado.

      imageAssim, na acção MVC, dependendo da situação, podemos invocar a "MobileView" ou "DesktopView". Abaixo está um pequeno exemplo de código que ilustra este exemplo. Agora podemos tentar imaginar conseguir o mesmo efeito, directamente, no code-behind das Web Forms. Difícil, muito difícil mesmo.

      public ActionResult Index(string deviceType)
      {
          if (deviceType == "Mobile")
          {
              return View("Mobile");
          }
          else
          {
              return View("Desktop");
          }
      }

      O HTML não é o único tipo de resposta 

      Ao usarmos uma estrutura action-first, então a acção pode dar-se ao luxo de decidir que tipo de tipo de resposta deve produzir. Isto torna o nosso sistema mais flexível em termos de uma mesma acção com diferentes outputs.

      Abaixo está mais um pequeno exemplo de uma ação MVC, que envia um resultado JSON ou HTML, dependendo do valor do parâmetro. Este tipo de flexibilidade é difícil de conseguir com nas Web Forms, porque forma desenhadas para retornar apenas HTML.

      public ActionResult Index(string viewType)
      {
          if (viewType == "JSON")
          {
              return Json(new Customer(), JsonRequestBehavior.AllowGet);
          }
          else
          {
              return View("DisplayCustomer", new Customer());
          }
      }

      Combinação de View e dados 

      Numa arquitectura action-first, o pedido chega primeiro à acção e esta escolhe a view e o modelo para retornar diferentes respostas.

      image

      Vejamos mais um pequeno exemplo em que uma acção MVC usa o mesmo modelo anexado a diferentes views. Neste exemplo, temos o modelo "CustomerData” que é anexado à viewDetailCustomer”, mas que noutra situação é anexado à viewCustomer”.

      public ActionResult Index(string ViewName, Customer customerdata)
      {
          if (ViewName == "Detailed")
          {
              return View("DetailCustomer", customerdata);
          }
          else
          {
              return View("Customer", customerdata);
          }
      }

      Este tipo de flexibilidade é muito difícil de alcançar através das Web Forms, porque a invocação do modelo está na própria view. Em seguida, é necessário escrever toda a lógica de decisão dentro do ciclo de vida da página e finalmente redirecionar para outra view, tornando a implementação muito pouco clara.

      Testabilidade

      No caso do MVC, um Controller é uma classe normal. Uma classe que pode ser instanciada num projecto de testes unitários simples, onde se podem facilmente testar vários aspectos, como a sessão, ViewBag, TempData, etc. Os controladores não estão acoplados a qualquer view específica, por isso pode ser reutilizados para realizar os testes necessários.

      public class HomeController : Controller
      {
          public ActionResult Index()
          {
              Session["SomeSession"] = "Is this set";
              return View("SomeView");
          }
      }

      Performance

      O ASP.NET MVC não tem suporte para o ViewState, de modo que não haverá qualquer gestão automática do estado, o que reduz o tamanho da página permitindo assim aumentar a performance.

      Total controlo sobre o HTML

      O ASP.NET MVC não suporta controlos de servidor. A única opção disponível é usar controlos de input do HTML, por isso sabemos exactamente que HTML vai ser gerado no final. Também vamos estar cientes sobre o Id de cada elemento. E assim a integração com bibliotecas Javascript, como o jQuery, torna-se bastante fácil.

      SEO, URL Routing e REST

      Fortes recursos de roteamento permitem tratar cada URL como um recurso com suporte a interfaces RESTful. Para além disso, são user-friendly e melhoram o SEO.

      Desenvolvimento paralelo

      No ASP.NET MVC as camadas têm baixo acoplamento entre si, pelo que um programador pode trabalhar num controlador, ao mesmo tempo que outro trabalha na View e um terceiro desenvolve o modelo. Tudo em simultâneo. É isto o chamado desenvolvimento paralelo. Smile

      Extensibilidade

      O ASP.NET MVC suporta múltiplos motores de views, como o ASPX ou o Razor e, se necessário, podemos criar o nosso próprio motor.

      Recursos ASP.NET existentes

      O ASP.NET MVC é construído em cima da framework ASP.NET e, portanto, fornece ao programador a utilização de muitas características boas, como a autenticação de formulários, a autenticação do Windows, cache de sessão, etc.

      A solução ASP.NET MVC

      Para mudar de uma arquitetura baseada em views para uma arquitectura baseada em acções MVC, é necessário fazer algumas alterações estruturais.

      A figura acima dá uma ideia dessas alterações:

      • Mover o code-behind para uma classe do tipo Controller, convertendo os eventos em métodos to tipo Action;
      • A Middle-layer ou Camada de Negócio transforma-se no Model, que fornece dados e aplica lógica e regras;
      • A View só faz a exibição, posicionamento e layout dos dados;
      • A DAL e outras camadas não mudam muito, já que não têm uma grande ligação com a questão do code-behind, diretamente.

      Assim, com a arquitetura MVC temos o seguinte fluxo de três etapas:

      • O utilizador final envia um Request. A aplicação direciona o Request para o controlador. O controlador é uma unidade lógica que agrupa um conjunto de acções;
      • O controlador mapeia o Request para uma acção particular;
      • Agora a ação tem duas tarefas para realizar, primeiro necessita obter os dados apropriados e de seguida esses dados têm que ser ligados à view adequada. A Acção cria o objeto do modelo e liga o modelo à view, para enviar a resposta final.

      O que perdemos?

      A maior vantagem das ASP.NET Web Forms é o RAD / Programação Visual. Mesmo que seja uma forma mais “suja” de fazer as coisas, pode ajudá-lo a completar as aplicações mais rapidamente e satisfazer os clientes num mais curto espaço de tempo. Mas esta rapidez tem um preço a longo prazo.

      Outra questão é que o ASP.NET MVC tem uma maior curva de aprendizagem. A ausência de ViewState e dum modelo de programação orientado por eventos torna  o ASP.NET MVC um pouco difícil para os programadores com pouca ou nenhuma experiência em desenvolvimento de aplicações Web.

      Conclusões

      A grande questão que se coloca sempre nestas alturas é quando e porque devemos utilizar determinada tecnologia em detrimento de outra.

      Existem dois factores que determinam de imediato a escolha da tecnologia a usar:

      • Se é fundamental entregar um resultado muito rapidamente, então as Web Forms são a única opção, uma vez que nem se pode sequer considerar o ASP.NET MVC para RAD (as razões para necessitar de RAD podem estar relacionadas com o cliente estar a pagar pouco pelo projecto, ou a aplicação vir a ser usada apenas durante poucos meses e não exigir muita manutenção);
      • Se a testabilidade da aplicação, em particular Testes Unitários, for fundamental, então a única opção é mesmo o MVC.

      Para além destas razões, a sugestão é dar prioridade à utilização do ASP.NET MVC. É uma evolução da framework ASP.NET, resolve a maioria dos problemas identificados nas Web Forms, permite uma grande testabilidade das aplicações e óbvios ganhos a longo prazo em termos de manutenção. Podem-se ainda ponderar os seguintes factores:

      • A equipa de desenvolvimento tem uma boa experiência de Web Forms e Windows Forms? Então deve-se levar em conta a curva de aprendizagem do MVC e a disponibilidade (mental e de tempo) da equipa para efectuar a transição. Poderá optar-se por manter as Web Forms em detrimento do MVC, mas com os custos e problemas anteriormente identificados;
      • A equipa tem experiência em ASP ou em tecnologias não-Microsoft, como Android, iOS, JSP, Ruby, PHP? Este tipo de tecnologias costuma usar a arquitectura MVC por defeito, pelo que será um passo natural usar o ASP.NET MVC;
      • O JavaScript vai ser amplamente usado? Mais uma vantagem para o MVC;
      • A performance é um factor importante? O MVC, sem o suporte para o ViewState oferece um bom ganho de desempenho em relação às Web Forms;
      • Prevê-se a reutilização da mesma lógica de input? Usar o MVC, sem dúvida.

      Como resumo final, podemos dizer que as ASP.NET Web Forms foram o caminho correcto para a Microsoft em 2000. O objectivo era atrair os programadores de VB6, VF e VC++, que eram viciados em programação RAD. As Web Forms atingiram o seu objectivo, mas agora está na hora de evoluir e avançar na direcção de uma melhor arquitectura, ou seja o MVC.

      Referências

      http://msdn.microsoft.com/en-us/magazine/dd942833.aspx#id0080030

      http://www.codeproject.com/Articles/821275/Webforms-vs-MVC-and-Why-MVC-is-better

      http://www.codeproject.com/Articles/528117/WebForms-vs-MVC

      quarta-feira, 20 de agosto de 2014

      Microsoft ASP.NET MVC– A história até agora

      Introdução

      Este artigo apresenta uma visão rápida da história do ASP.NET MVC e dos recursos e funcionalidades mais importantes, introduzidos nas principais versões.

      Este será o primeiro de uma série de artigos dedicados ao ASP.NET MVC. Constitui apenas uma pequena introdução, recomendando-se a consulta da vasta documentação online sobre o tema, começando pela página oficial da Microsoft, aqui.

      Conteúdo

      ASP.NET MVC 1.0 (2009)

      A primeira versão oficial foi lançada em 2009 e trouxe todas as características fundamentais da framework, que perduram até hoje:

      • Para começar, o próprio conceito de MVC, com o pipeline simplificado de processamento e separação do processamento do pedido (no Controller) e a renderização do output (na View);
      • O conceito de Routing (que foi incorporado, de seguida, na Framework .NET);
      • Helpers simples para renderizar tags HTML;
      • Helpers para criar facilmente links e forms AJAX;
      • Ligação automática de formulários submetidos (posted forms) a objetos .NET e uma espécie de validação do modelo.

      Este foi um grande passo em direção a uma nova web, mas a primeira versão obrigava a demasiado desenvolvimento de infra-estrutura, por forma a ser produtivo em cenários empresariais e em grandes aplicações.

      O ASP.NET MVC foi também o primeiro produto da Microsoft a ser realmente extensível. A maioria dos componentes do núcleo podiam ser estendidos ou mesmo totalmente substituídos por implementações próprias.

      ASP.NET MVC 2 (2010)

      No ano seguinte, foi lançada a segunda versão da framework ASP.NET MVC. O foco desta atualização foi aumentara a produtividade e  facilitar a manutenção nas grandes aplicações:

      • Validação do modelo com base em atributos, tanto do lado do servidor como do lado do cliente;
      • Introdução das Areas, para particionar as grandes aplicações;
      • Html Templated Helpers, para renderizar automaticamente formulários de edição e páginas de exibição, com base no modelo e nos atributos aplicados sobre o mesmo;
      • Controladores assíncronos;
      • HTML Helpers baseados em Expressões Lambda para remover a maioria das “strings mágicas” anteriormente necessárias nos Html Helpers.

      ASP.NET MVC 3 (2011)



      No início de 2011, foi lançada a versão 3 do ASP.NET MVC, juntamente com uma pilha de outras ferramentas muito interessantes, como o NuGet, IIS Express e SQL Server Express.

      As novidades introduzidas nesta versão foram:

      • Só funciona em .NET 4;
      • Novos modelos de projecto, com suporte para HTML5 e CSS3;
      • Validação com unobtrusive javascript e melhor desempenho geral do javascript;
      • Validação remota e melhoria geral da validação do modelo;
      • Dependency Resolver incorporado;
      • Razor: o novo motor para Views;
      • Suporte para vários motores para Views, i.e., Web Forms, Razor ou open source;
      • Melhorias do controlador como a propriedade ViewBag e tipos de ActionResults;
      • Filtros globais;
      • Cache de output para página parcial.

      ASP.NET MVC 4 (2012)




      Em 2012, é lançada a versão 4 do ASP.NET MVC com algumas novidades significativas:

      • ASP.NET Web API, uma framework que simplifica a criação de serviços HTTP e serve uma grande variedade de clientes;
      • Renderização adaptável e outras melhorias “look-n-feel” nos modelos padrão de projeto;
      • Um modelo de projeto verdadeiramente vazio;
      • Introduzido novo modelo de projecto Mobile, baseado em jQuery Mobile;
      • Suporte para adicionar controladores de outras pastas de projecto;
      • Controlo de tarefas para controladores assíncronos;
      • Controlo de Bundling and Minification através de web.config;
      • Suporte para logins  OAuth e OpenID com a biblioteca DotNetOpenAuth;
      • Suporte para o Windows Azure SDK 1.6 e posteriores.

      ASP.NET MVC 5 (2013)



      No último trimestre de 2013 foi lançada a versão 5 do ASP.NET MVC, que passou a ser a versão standard de MVC do Visual Studio 2013. As principais novidades introduzidas foram:

      • O Bootstrap substitui o modelo padrão MVC;
      • ASP.NET Identity para autenticação e gestão de identificação;
      • Authentication Filters para autenticação customizada de utilizador ou por provedor de autenticação de terceiros;
      • É agora possível substituir filtros num método ou controlador;
      • O Attribute Routing está agora integrado no MVC 5.

      ASP.NET MVC 5.1 (Janeiro 2014)

      • Melhorias no Attribute Routing;
      • Suporte para tipos Enum nas Views;
      • Suporte para Bootstrap nos modelos de editores;
      • Validação não intrusiva para os atributos de modelo MinLengthAttribute e MaxLengthAttribute;
      • Suporte para o contexto this no Unobtrusive Ajax.

      ASP.NET MVC 5.2 (Julho 2014)

      • Melhorias no Attribute Routing.

      Todas as versões do ASP.NET MVC

      A título de curiosidade lista de todas as versões do ASP.NET MVC, lançadas pela Microsoft, é a seguinte:

      Data
      Versão
      2007-12-10
      ASP.NET MVC CTP
      2009-03-13
      ASP.NET MVC 1.0   (download)
      2009-12-06
      ASP.NET MVC 2 RC
      2010-02-04
      ASP.NET MVC 2 RC 2
      2010-03-10
      ASP.NET MVC 2   (download)
      2010-10-06
      ASP.NET MVC 3 Beta
      2010-11-09
      ASP.NET MVC 3 RC
      2010-12-10
      ASP.NET MVC 3 RC 2
      2011-01-13
      ASP.NET MVC 3   (download)
      2011-09-20
      ASP.NET MVC 4 Developer Preview
      2012-02-15
      ASP.NET MVC 4 Beta
      2012-05-31
      ASP.NET MVC 4 RC
      2012-08-15
      ASP.NET MVC 4   (download)
      2013-05-30
      ASP.NET MVC 4 4.0.30506.0
      2013-06-26
      ASP.NET MVC 5 Preview
      2013-08-23
      ASP.NET MVC 5 RC 1 [a]
      2013-10-17
      ASP.NET MVC 5 [a]
      2014-01-17
      ASP.NET MVC 5.1 [a]
      2014-02-10
      ASP.NET MVC 5.1.1 [a]
      2014-04-04
      ASP.NET MVC 5.1.2 [a]
      2014-06-22
      ASP.NET MVC 5.1.3 [a]
      2014-07-01
      ASP.NET MVC 5.2.0 [a]

      [a] http://www.nuget.org/packages/Microsoft.AspNet.Mvc