Atenção: esse artigo tem dois vídeos complementares.
Clique e assista o primeiro!

Clique e assista o segundo!

De que se trata o artigo

Este artigo tem por finalidade discutir a construção de aplicações Web segundo a arquitetura MVC. Para isto, serão discutidas características do framework ASP.NET MVC 3, bem como implementada uma aplicação testando alguns dos conceitos e recursos aqui apresentados.

Em que situação o tema é útil

A construção de aplicações Web em conformidade com boas práticas de desenvolvimento requer, antes de mais nada, uma correta estruturação da solução que se está elaborando. Embora a tecnologia Web Forms possa ser combinada com outros frameworks para a obtenção de aplicações robustas e escaláveis, o próprio fato da mesma se amparar em conceitos RAD (Rapid Application Development) pode estimular, por sua vez, a ausência de uma maior preocupação no que se refere à utilização de padrões de eficácia já comprovada. O framework ASP.NET MVC amplia as possibilidades oferecidas para o desenvolvimento Web dentro da plataforma .NET, fundamentando-se para isto no design pattern conhecido como MVC (Model-View-Controller): a arquitetura resultante disto tem como benefícios a obtenção de partes da aplicação mais coesas, assim como torna viável a execução de testes automatizados sobre partes específicas do software que se está construindo.

Construindo soluções Web em conformidade com o padrão MVC

Embora o Web Forms tenha contribuído para que a tecnologia ASP.NET se consolidasse como uma das principais alternativas para a construção de aplicações Web, a utilização do mesmo isoladamente (ou seja, sem a combinação com outras tecnologias ou frameworks) apresenta algumas limitações. Soluções construídas valendo-se apenas dos recursos do modelo Web Forms e sem uma boa modelagem acabam por se revelar, com o decorrer do tempo, como difíceis de manter ou mesmo de serem submetidas a testes unitários automatizados: a principal razão para isto está no forte acoplamento entre lógica de negócio e a camada de apresentação. Procurando a atender à demanda por um desenvolvimento bem estruturado desde os estágios iniciais de um projeto, a Microsoft disponibilizou o framework ASP.NET MVC. Este último encontra-se atualmente na versão 3, sendo que o mesmo representa a implementação do design pattern conhecido como MVC (sigla do inglês Model-View-Controller): tal padrão estabelece diretrizes para a construção de soluções com uma clara separação de responsabilidades entre as partes constituintes, facilitando com isto manutenções futuras do código, prováveis evoluções ou, ainda, a execução de testes unitários sobre componentes específicos da solução em questão.

O crescimento vertiginoso da Internet ao longo dos anos deveu-se, entre outros fatores, à larga aceitação que o padrão HTML teve. Começando ainda na década de 90 e chegando aos dias atuais, esta linguagem de marcação continua a ser a principal base para o desenvolvimento de aplicações Web. Inicialmente, páginas da Internet eram apenas documentos estáticos, não contando com elementos dinâmicos que se assemelhem aos recursos a que todos estão habituados nos dias atuais.

Com o advento do padrão CGI (Common Gateway Interface) surgiram aplicações Web com conteúdo dinâmico, nas quais informações eram geradas em resposta a ações específicas de seus respectivos usuários, abandonando-se assim o caráter até então estático das páginas HTML convencionais.

Tudo isto permitiu, por sua vez, que se integrassem páginas Web com bases de dados relacionais, abrindo assim um amplo leque de possibilidades que culminou com o surgimento de novas áreas como o e-commerce. O mundo corporativo também foi profundamente transformado: surgiram aplicações de negócio (e-business) integrando áreas de uma organização dispersa geograficamente ou, mesmo, que possibilitaram o intercâmbio de informações entre diferentes companhias. PERL e C++ figuram entre as primeiras linguagens de programação a suportar esta tecnologia.

Importante ressaltar o fato de uma página Web não ser composta apenas por HTML. Outros mecanismos como folhas de estilo CSS (Cascading Style Sheets) e código JavaScript são exemplos de recursos comumente empregados no desenvolvimento para a Internet. Vídeos, áudio e pequenas aplicações também podem ser integrados em páginas Web empregando para isto plugins: aplicativos em Flash ou Silverlight, além de applets Java, constituem exemplos do uso desta técnica.

Outros mecanismos de script como AJAX (Asynchronous JavaScript and XML), JSON (JavaScript Object Notation) e jQuery (conjunto de bibliotecas que simplifica o uso de JavaScript) também contribuem para a obtenção de interfaces Web avançadas. Recursos como estes permitem a introdução de uma série de comportamentos dinâmicos dentro de uma aplicação, facilitando com isto a interação de usuários com as funcionalidades presentes num site.

O .NET Framework conta, desde sua primeira versão, com um amplo suporte à construção de aplicações Web. Isto acontece através do ASP.NET, sendo este um conjunto de recursos responsável por oferecer meios para a construção de sites e Web Services que se beneficiam dos numerosos recursos que a plataforma .NET oferece.

No que se refere à criação de sites, o ASP.NET conta, desde os seus primórdios, com a tecnologia conhecida como Web Forms. Esta última, por sua vez, foi concebida segundo princípios da metodologia RAD (Rapid Application Development): foca-se com isto na construção de interfaces gráficas que possam ser modeladas facilmente a partir de uma ferramenta de desenvolvimento (no caso, o Visual Studio), fazendo-se uso de um extenso conjunto de componentes visuais e de técnicas de orientação a objetos, bem como de programação orientada a eventos.

De certa forma, a programação em Web Forms tentou se aproximar ao máximo daquilo que desenvolvedores estavam habituados dentro da construção de aplicativos para desktop, encurtando com isto a curva de aprendizado dos mesmos no tocante à criação de soluções para a Web. Contudo, o Web Forms mostrou, com o decorrer do tempo, algumas limitações dentro de cenários específicos que serão mencionados mais adiante neste artigo.

Procurando atender à demanda por recursos para um desenvolvimento Web focado em padrões arquiteturais de eficácia comprovada, metodologias ágeis e baseado em técnicas de teste conhecidas como TDD (Test Driven Development), a Microsoft disponibilizou, como parte constituinte da plataforma .NET, o ASP.NET MVC. Este framework encontra-se atualmente na versão 3.0.

O objetivo deste artigo é abordar a construção de soluções que façam uso da arquitetura MVC dentro da plataforma .NET. Para isto, será efetuada uma análise das estruturas empregadas pela tecnologia ASP.NET MVC, assim como de que maneira a mesma pode ser combinada com outros recursos para a obtenção de aplicações robustas e bem modeladas. Será desenvolvida também uma aplicação de exemplo utilizando alguns dos recursos de MVC aqui discutidos, com a utilização em conjunto de mecanismos como jQuery e o Entity Framework.

Nota do DevMan

TDD (sigla do inglês Test Driven Development) é um processo para desenvolvimento de software que enfatiza, através de uma série de princípios propostos por metodologias ágeis, a construção de soluções em um modo no qual as mesmas poderão ser facilmente integradas a uma ferramenta de automação de testes unitários. A adoção desta prática implica na codificação dos testes unitários antes mesmo da escrita das partes da aplicação que serão submetidas aos mesmos.

Dentre as vantagens em se atuar desta forma está o fato de que se assegura com essa técnica um grau mínimo de testes na aplicação que se está construindo, bem como se torna mais fácil que se controlem mudanças efetuadas em códigos pré-existentes (através da análise do resultado de testes automatizados).

Pontos de atenção no desenvolvimento com Web Forms

Os diversos recursos existentes dentro do modelo de programação Web Forms possibilitaram, ao longo dos anos, que o ASP.NET se consolidasse como uma das mais populares tecnologias para o desenvolvimento de aplicações Web. A proposta de um desenvolvimento segundo princípios de RAD foi, sem sombra de dúvidas, um fator-chave para que o .NET se transformasse numa das principais plataformas para construção de soluções de software.

É um fato bastante comum que projetos envolvendo a utilização de Web Forms sejam implementados, ainda, em conjunto com frameworks que promovam o uso de padrões e boas práticas de desenvolvimento. Tudo isto pode resultar, desde que levando em conta um bom planejamento, em aplicações bem estruturadas, assim como dotadas de uma arquitetura que se revele flexível diante da necessidade de mudanças (algo dado como quase certo em projetos de software).

No entanto, empregar a tecnologia Web Forms de forma isolada e sem uma série de cuidados pode resultar, por sua vez, em algumas lacunas ou mesmo em possíveis problemas ao longo da utilização de uma determinada solução de software. Serão listados a seguir alguns pontos que exemplificam isto.

O mecanismo do ASP.NET conhecido como View State permite, via de regra, a preservação do estado dos diversos controles que constituem uma página Web ao longo das diversas requisições geradas pela mesma. Tais requisições são, normalmente, fruto de ações de um usuário a partir da utilização das funcionalidades expostas pela Web Page em questão. Páginas que façam uso indiscriminado deste recurso podem conduzir a situações nas quais o tempo de resposta da aplicação pode aumentar consideravelmente, haja vista a necessidade de transferência dos dados de View State entre o browser do usuário e um servidor Web a cada requisição HTTP gerada.

Embora o modelo de code-behind possibilite que se isolem detalhes da camada de apresentação da lógica de negócio inerente a uma funcionalidade, isto em muitas situações acaba por não acontecer em termos práticos. É bastante comum que dentro da classe que corresponde à implementação de um Web Form encontrem-se misturados trechos de código que controlem aspectos relativos à exibição de controles visuais, acesso a bases de dados e outros repositórios de informações, além de regras relativas a funções específicas do negócio que se está levando em consideração.

Tudo isso se reflete, em muitos casos, em construções de código extensas e que apresentam uma complexidade desnecessária. Tais fatores comprometem atividades futuras de manutenção ou mesmo evolução da aplicação que se está considerando: os diversos componentes que constituem a solução apresentam baixa coesão e um forte acoplamento com outras partes da mesma, características estas que vão na contramão daquilo que se espera de um software bem estruturado.

Conforme já mencionado anteriormente, isto pode ser resolvido através do uso de outros frameworks em conjunto com o padrão Web Forms. No entanto, esta tecnologia não conta com recursos nativos que permitam se atenuar ou mesmo evitar aspectos indesejados como os que aqui foram citados.

Importante frisar, ainda, que aplicações Web Forms sem uma clara separação de responsabilidades entre a lógica de apresentação, a de negócios e funcionalidades de acesso a dados podem inviabilizar, por sua vez, a utilização de mecanismos para a realização de testes unitários automatizados.

Os controles visuais existentes em Web Forms geram por si próprios a codificação HTML que constará numa página Web. Embora esta abordagem traga benefícios, existem também ocasiões nas quais o HTML resultante não atende aos requisitos para a Web Page que se está implementando ou, mesmo, que a nomenclatura complexa dos controles gerados dificulte a manipulação dos mesmos via JavaScript. Diante disto, não é raro também que ocorram falhas na aplicação de regras de aparência definidas via CSS.

Nota do DevMan

Separação de Responsabilidades (do inglês Separation of Concerns) é um princípio de desenvolvimento de sistemas que busca fornecer, através de uma série de recomendações, diretrizes que conduzam à obtenção de aplicações formadas por componentes mais coesos. O conceito de coesão, por sua vez, deve ser compreendido como a medida com a qual uma estrutura de software (classe ou componente) atende o objetivo inicial para o qual foi concebida. Uma alta coesão indica que o item que se está considerando não acumula responsabilidades além daquelas para as quais foi especificado, sendo esta uma característica perseguida por todos os projetos de software que procuram ser bem estruturados.

ASP.NET MVC: uma visão geral

MVC (sigla em inglês para Model-View-Controller) é um pattern de arquitetura para a construção de Web sites, sendo que o mesmo estabelece a separação de uma aplicação em 3 partes principais: Model, View e Controller. Já o framework ASP.NET MVC, por sua vez, é a implementação da Microsoft para este padrão, permitindo ainda que recursos oriundos do ASP.NET como a autenticação via Membership e master pages sejam facilmente integrados a uma solução MVC. As diversas funcionalidades disponibilizadas pelo ASP.NET MVC encontram-se definidas dentro do namespace System.Web.Mvc.

A camada Model corresponde a dados e respectivas regras para manipulação destes últimos. As estruturas aqui disponibilizadas são normalmente manipuladas por Controllers, servindo ainda de base para a geração de informações que constarão em Views devolvidas como resposta a alguma ação solicitada por um usuário. É bastante comum que se implemente a camada Model fazendo uso de algum framework de ORM (mapeamento objeto-relacional): constituem exemplos disto o Entity Framework, LINQ to SQL e o NHibernate.

Já a camada Controller conta com classes responsáveis pelo tratamento de requisições, sendo isto realizado por meio de métodos declarados nas mesmas. Tais operações equivalem às possíveis ações (Actions) a serem executadas por um tipo que corresponda a um Controller. O processamento de uma Action envolve, normalmente, o acesso a informações existentes na camada Model e a devolução de um resultado por meio de uma estrutura presente na camada View.

Por fim, a camada View contém um conjunto de páginas e controles empregados na exibição de informações processadas por Controllers. Dentro de uma View um usuário poderá não apenas consultar informações, como ainda desencadear uma ação a ser processada por um Controller criado especificamente para este fim.

...
Quer ler esse conteúdo completo? Tenha acesso completo