Uma arquitetura de Software para estruturar aplicações web complexas Resumo Neste artigo é apresentada uma arquitetura para construir famílias de aplicações web complexas. Primeiramente são caracterizadas as tendências para aplicações web, desde web sites apenas para leitura de conteúdo até aplicações sofisticadas onde complexas transações distribuídas devem ser suportadas. Introdução Construir aplicações web é uma tarefa complexa, pois essas aplicações quase sempre agem como integradores de repositórios de dados e comportamentos distribuídos, e usualmente devem suportar múltiplos perfis de usuários. É preciso entender o domínio de aplicações subjacente: objetos, comportamentos, regras de negócios e etc., e adotar arquiteturas de software flexíveis nesse domínio. Engenharia sistemática e abordagens orientadas a reuso devem ser utilizadas. Neste artigo é apresentada uma arquitetura baseada em componentes e um framework de implementação para construir aplicações web complexas. Princípios de design para aplicações web Boas aplicações web devem ser primeiramente boas aplicações de hipermídia, pois a Web é baseada no paradigma de hipertexto, e também é composta de páginas que podem ser ligadas através de URLs. Deve-se utilizar boas práticas de design de hipermídia para construir aplicações web que são fáceis de usar, que provêm espaços amigáveis de navegação e que integram o comportamento transacional subjacente com a metáfora provida pelos links navegacionais. As mais maduras metodologias de design web reconhecem este fato e claramente separam o design dos dados dos aspectos comportamentais da aplicação, dos aspectos navegacionais e de interface. A clara separação de preocupações é reconhecida como chave para se obter qualidade de design de reuso, assim como fácil evolução e manutenção. Entretanto, em muitos casos esses benefícios são parcialmente perdidos durante a implementação, devido ao pobre suporte para mecanismos de composição e abstração nas plataformas de implementação existentes. A arquitetura de software apresentada nesse artigo junto com um framework de implementação permite melhorar o processo de mapear um esquema de design em uma aplicação Web. A arquitetura suporta e encoraja o uso de uma série de princípios de design providos pela maioria das metodologias, e implementa eles no contexto da arquitetura J2EE, melhorando portanto, as abordagens existentes para o uso de J2EE. Os principais princípios são: - As aplicações devem ser construídas usando-se camadas nas quais diferentes preocupações são levadas em conta, em particular, dados da aplicação devem ser separados dos conteúdos das páginas e estes conteúdos devem ser claramente separados da aparência das paginas. - As páginas devem representar visualizações lógicas dos objetos de domínio, permitindo a construção de aplicações personalizadas de acordo com o perfil do usuário simplesmente mudando as visualizações ao invés dos objetos de domínio. Como ambiente de implementação, J2EE tem se tornado popular para implementação de aplicações distribuídas de múltiplas camadas. A plataforma consiste de três camadas: cliente, meio e EIS (Enterprise Information System). No nível de cliente pode-se ter uma aplicação desktop ou um browser web, a camada EIS geralmente lida com a persistência, enquanto a camada do meio lida com duas sub-camadas: o container web, onde são distribuídas as páginas JSP e os servlets e o container EJB, onde são distribuídos os componentes Enterprise Java Beans (EJBs), que implementam as regras de negócios. Usar J2EE pode ser difícil, pois as responsabilidades de cada camada podem ser distribuídas de forma incorreta. Entretanto, se for utilizada uma arquitetura de software, como MVC (Model-View-Controller), evita-se deixar a maioria das decisões de arquitetura para o programador e o processo é simplificado. Porque é necessário utilizar uma arquitetura de software? A evolução das plataformas de software para construção de aplicações web mostra uma tendência para adoção de arquiteturas modulares, nas quais componentes de programa e suas iterações seguem práticas estabelecidas de engenharia de software, como separação de atribuições, bom suporte para evolução e etc. Por exemplo, pode-se considerar o uso da arquitetura MVC para desacoplar a interface com o usuário dos dados da aplicação e das duas funcionalidades. O model contém os comportamentos de dados da aplicação, também provendo uma interface entre a view e o controller. Para cada interface com o usuário, um objeto view é definido, contendo informação sobre os formatos de apresentação, e é sincronizada com o estado do model. Finalmente o controller processa as informações entradas pelo usuário e traduz isso em requisições para funcionalidades específicas da aplicação. Esta separação reflete bem o fato de as aplicações Web podem ter diferentes visualizações, no sentido de que podem ser acessadas através de diferentes clientes como browsers, clientes de Web Services, etc. As vantagens de se utilizar uma abordagem arquitetural para construção de software se tornam mais tangíveis quando se pode refinar a arquitetura em um conjunto de arquiteturas mais detalhadas para aplicações de domínios específicos. Pode-se construir diferentes frameworks de aplicação para cada domínio. O desenvolvimento de novas aplicações vai apenas envolver a instanciação e a conexão entre componentes de framework, ao invés de fazer tudo do zero. A Arquitetura OOHDM-Java2 (Object-Oriented Hypermedia Design Model) Limitações da arquitetura MVC A arquitetura MVC oferece um conjunto de princípios estruturais para construção de aplicações interativas modulares, mas não atende completamente aos requerimentos das aplicações Web que devem oferecer ricas estruturas de hipermídia, pois é baseada em uma visão de software puramente transacional. Pior de tudo, não leva em consideração os aspectos de navegação que deveriam ser apropriadamente suportados. Para resolver este problema foi proposta a criação de um nível navegacional que encapsula toda a lógica de navegação. Enquanto a JSP é responsável pela estrutura de layout da página, a camada navegacional gerencia os conteúdos das páginas e lida com as informações específicas de contexto. Visão da arquitetura OOHDM-Java2 A arquitetura Modelo para Design de Hipermídia Orientada a Objetos e o framework arquitetural associado foi projetada e implementada com os seguintes objetivos: - Deve suportar e encorajar boas práticas de implementação e design; - Dever ser facilmente portável entre plataformas; - Deve ter dependências mínimas em linguagens de programação e/ou ferramentas particulares; - Deve implementar as mais comuns abstrações utilizadas em aplicações web, deixando o designer com a tarefa de apenas prover código específico da aplicação; - Deve suportar a construção de aplicações web transacionais complexas; - Deve ser fácil de usar em aplicações apenas de leitura; - O reuso de componentes deve ser principalmente do tipo black-box (o designer deve apenas conhecer a interface dos componentes arquiteturais). OOHDM-Java2 estende a idéia do MVC por claramente separar as páginas de suas interfaces, assim introduzindo a idéia de objeto de navegação, e também reconhece o fato de que a navegação pode ser dependente de contexto. Os principais componentes da arquitetura OOHDM-Java2 são: - HTTP-REQUEST Tradutor (Controller): Cada requisição http é direcionada a esse componente. Ele então traduz a requisição do usuário em uma ação a ser executada pelo modelo. - Executor (Controller): Este componente tem a responsabilidade de executar o evento de negócios, invocando comportamentos do modelo seguindo alguma lógica pré-definida. - Objeto de negócios (Model): este componente encasula dados e funcionalidades específicas da aplicação. Todas as regras de negócio são definidas nesses objetos e são disparadas pelo executor para executar um evento de negócio. - Seletor de visualização (Controller): depois da execução de um evento de negócio, esta componente pega o estado de certo objetos de negócio e seleciona a visualização da resposta (interface). - Nó de navegação (Visualização Extendida): este componente representa o produto da lógica navegacional da aplicação. Encasula atributos que foram obtidos de alguns objetos de negócios e outros sub componentes como indexes, ancoras, etc. Este componente tem os conteúdos a serem mostrados pela interface de resposta (JSP). - JSP (Visualização estendida): este componente gera a aparência que o cliente do componente recebe como resposta a sua requisição. Adotando uma arquitetura específica de domínio Um dos mais importantes benefícios de se usar uma abordagem centrada em arquitetura é que isso melhorar reuso em larga escala de componentes de aplicação. Foi introduzido o conceito de Web Design Frameworks (WDF) como “um modelo genérico e reutilizável de aplicação Web em um domínio particular, que pode ser posteriormente instanciado em aplicações específicas dentro daquele domínio”. Por exemplo, podemos descrever a WDF para a área de e-commerce construindo um modelo conceitual genérico, adicionando navegação genérica correspondente e modelos de interface e então refinar isso para construir uma e-store particular. A arquitetura OOHDM-Java2 permite mapear os modelos reusáveis de modelos de aplicações em uma arquitetura de domínio específico em que os artefatos de design genérico são implementados usando-se os componentes bases do framework. Conclusões Neste artigo foi apresentado a arquitetura OOHDM-Java2 e o seu framework associado. A estrutura geral da arquitetura foi apresentada e implementa uma extensão do modelo MVC e prove muitas características positivas para construção de aplicações Web. Referência: [1] Mark Douglas Jacyntho, Daniel Schwabe, Gustavo Rossi: A Software Architecture for Structuring Complex Web Applications. Disponível em: http://wwwconf.ecs.soton.ac.uk/archive/00000179/01/index.html