Entendendo a Arquitetura de Desenvolvimento

Propaganda
4
Capítulo
Entendendo a Arquitetura
de Desenvolvimento
6
A
Introdução
- Reúso de Arquitetura de Software
O
jCompany Developer Suite pode ser compreendido como uma solução de reúso em nível
arquitetural. E não apenas para reúso de camadas de base de arquitetura para as aplicações
desenvolvidas, mas também para o ambiente de desenvolvimento (IDE) e de Testes de Unidade. Estas
soluções arquiteturais de base são providas, respectivamente, pelos módulos jCompany FS
Framework, jCompany IDE e jCompany Test for Developer.
Mas qual seria a diferença deste tipo de reúso em comparação ao reúso mais pontual, digamos, em nível
de uma classe ou pequeno grupo de colaboração de classes?
O reúso arquitetural possibilita reúso de estratégias complexas englobando desde o reúso de
colaborações extensas de frameworks, somada à produção assistida de especializações preconizadas por
métodos e padrões delineados pela arquitetura. Este tipo de reúso é de mais alto nível que os demais.
Digamos, uma integração de várias estratégias de reúso pontuais, que produz um resultado de
valor visível para o cliente (Ex.: um Caso de Uso potencial) e não soluções parciais intermediárias.
Em outras palavras: muito embora sejam importantes as táticas de reúso em nível de classe ou via padrões de
projeto (Design Patterns), o reúso arquitetural é de nível mais estratégico, fundamental para quem deseja
ganhos de produtividade e qualidade em ambientes com desenvolvimentos em larga escala. Estes
ganhos equivalem aos que se consegue construindo uma nova casa a partir de componentes maiores, préfabricados, em comparação a se começar selecionando madeira para fabricar portas, por exemplo .
Apesar de não existir uma única solução de arquitetura perfeitamente adequada a todas as situações, as
diversas dimensões de arquitetura pré-implementadas no jCompany são customizáveis...
Para isso vingar na prática, porém, torna -se necessário um entendimento mais profundo das suas
implementações, inclusive das motivações fundamentais (Rationale) que guiaram a Powerlogic em sua
proposta. Este capítulo inicia esta discussão.
Estudo de Evolução de Arquiteturas de Software Java EE
- O que é Arquitetura de Software?
Já discutimos sobre a importância da arquitetura no Capitulo 1, mas não pressupomos que todos tenham
conhecimentos balizados sobre o assunto. Por isso, vamos rever algumas definições fundamentais:
“Uma Arquitetura de Software para um sistema é a que define a estruturação deste sistema, que compreende
seus Elementos, a Relação entre eles e as Propriedades externamente visíveis destes Elementos e Relações.”
Ref . A 6.1. [TS-4619 JavaOne 2006]
“Arquitetura de Software é a decomposição do problema de uma maneira que permita ao desenvolvimento
eficientemente resolvê-lo, considerando restrições (...)”
Ref . A 6.2. [John Klein- “A rchitecture and Design”]
“A arquitetura de qualquer aplicação deve ao menos incluir (quando não se basear em) considerações de
performance. A arquitetura de uma aplicação corporativa deve considerar os Ciclos de Vida de Objetos, assim
como a sua forma de uso”
Ref . A 6.3. [Haines, Steven 2006]
Não há muita controvérsia sobre a importância decisiva que uma boa Arquitetura de Software pode ter
em processo de desenvolvimento de software em geral. Também há um grande reconhecimento, por
Capítulo A4
parte de especialistas, com relação ao papel central que os frameworks assumem nesta questão. Porém,
muitas empresas não chegam a experimentar os re sultados prometidos nesta área.
Para não corrermos este risco e obtermos os melhores resultados, nossa proposta somará o reúso de
uma arquitetura abrangente com padrões de alto nível e automação de atividades, orquestradas p or
Cheat-Sheets do Eclipse.
Nossa arquitetura também será ajustada para a eficiência de processamento, outro ponto comumente
negligenciado. É um erro imaginar a arquitetura apenas do ponto de vista estrutural e t eórico. A
arquitetura influi decisivamente em performance e devem ser considerados os comportamentos dinâmico
e prático da aplicação, além dos fatores usabilidade, flexibilidade e outras dimensões concorrentes, em
nossa problemática.
Não se satisfaça com uma Arquitetura de Software rasa. Mesmo uma arquitetura incipiente poderá produzir um
bocado de documentos e diagramas impressionantes, mas trará resultados medíocres, quando algum. Uma
arquitetura para o perfil típico de projetos corporativos, por exemplo, deve definir, em detalhes, dependências
entre projetos e módulos, pacotes dentro de projetos, artefatos, eventos de programação de alto nível e,
finalmente, trazer um bom número de generalizações e padrões que conduzam a um resultado visível para o
negócio, rapidamente.
Nos próximos tópicos, discutiremos níveis de maturidade de arquiteturas de software.
- Arquitetura de Software “Invisível”
Em nossa experiência não é incomum encontrar empresas desenvolvendo em Java EE em um estágio
onde ainda não há nenhuma arquitetura realmente visível para os implementadores. Neste nível
de maturidade, o que se chama de arquitetura são alguns “documentos”, traçando diretrizes conceituais
para o uso de MVC, este ou aquele framework ou até determinados Design Patterns.
Este cenário primitivo é, claro, melhor que nada. Mas insuficiente para se perceber qualquer ganho
considerável nesta área – um estágio ao qual chamamos de “Arquitetura de Software Invisível”,
ilustrado na Figura A6.1.
Figura A 6.1. A rquitet ura de sof tware “Invisível”.
Neste estágio, as lacunas estão vazias entre a plataforma de infraestrutura Java EE (1) e as aplicações de
negócio (5). Por este motivo, um enorme potencial para erros está à espreita dos desenvolvedores, que
ficam às voltas com programações repetitivas de código, que deveriam estar fatoradas em
nível arquitetural.
Não há como evitar. Para uma arquitetura real, será necessário que os arquitetos passem do domínio dos
conceitos para a “experiência de uso nas tecnologias, suas possíveis combinações, deficiências e valores, além
de prováveis variações de uso”.
Montar uma arquitetura madura demanda um tempo que não pode ser facilmente abreviado –
especialmente uma que envolva altíssimas taxas de reúso, partindo de soluções “best-of-breed” Java EE
Open Source. Nesta filosofia, que é a adotada pelo jCompany, a recomendação é escolher peças
“melhores em seu segmento”. Algumas dezenas de tecnologias, projetos e componentes OSS deverão ser
Entendendo a Arquitetura de Desenvolvimento
entendidos, selecionados, especializados e integrados, muitos deles em áreas de conhecimento com
razoável distinção das demais.
Por exemplo, a camada Visão do MVC envolve a orquestração de diversas tecnologias complexas, tais
como Facelets (XHTML)/HTML, Javascript, CSS, Ajax, técnicas de gestão de leiautes, etc.,
nenhuma delas de domínio específico do mundo Java ou OO, de domínio dos Arquitetos de
Software. O resultado, na prática, é uma quase ausência de arquitetura para a camada Visão,
delegada para tratamento superficial pelos Web Designers.
Refinar uma boa arquitetura para a camada Controller também tem seus desafios, já que esta é bem
mais complexa, tecnologicamente, do que as camadas subsequentes de Model/Domínio ou Persistence. É
uma outra camada onde o nível de soluções de arquitetura costuma ser muito raso, basicamente
consistindo de homologação de algum framework de base "em seu estágio bruto".
As camadas de Model, Domínio e Persistence, por serem mais puramente ligadas a linguagem Java e
às regras de negócio costumam receber 90% da atenção nos trabalhos típicos de Arquitetura de
Software, ao menos em seu estágio inicial. Porém, ao longo do tempo se fará necessário um esforço
nas demais camadas, que exigirão um considerável aprofundamento tecnológico.
- Arquitetura de Software “Anêmica”
Em um estágio um pouco mais adiantado, o trabalho acima já terá se iniciado, de modo que a
arquitetura já pode ser vista na forma de software, concreta, como uma “solução de base
corporativa a ser reutilizada”.
Esta solução é frequentemente composta de uma pilha (stack) de produtos e framework de base Open
Source integrados, normalmente definida após alguns meses iniciais de prospecção, seleção e integração
“leve”. Digamos, de uma dúzia de produtos de base, complementados por documentos de guia em nível
mais detalhado. Ela está representada pela camada (2) na figura A4.2.
Mas neste nível de maturidade, como no anterior, ainda há uma grande migração de problemas “não
funcionais” para a camada de Core Business (5) e programadores “do negócio” lidando indevidamente
com:
o
Códigos MVC “burros” (de->para, fachadas artificiais);
o
Gerenciamento de transações manuais;
o
Instanciações de objetos manuais;
o
Códigos Java para inclusão, alteração, exclusão (CRUD);
o
Elaboração de formulários “do zero”;
o
Gestão de leiautes manual;
o
Etc.
Há um avanço perceptível com relação à arquitetura “meramente conceitual” do início , mas neste nível a
arquitetura ainda é rasa ao ponto de não eliminar mesmo variabilidades básicas indesejáveis.
A distância entre a realidade e a promessa de retorno de ambientes Orientados a Objeto continua imensa
- por isto batizamos a este estágio de “Arquitetura de Software Anêmica”.
É um estágio basicamente caracterizado por uma integração pouco profunda e abrangente entre um
número também insuficiente de produtos Open Source de base, conforme ilustra a Figura A6.2. Note que
as camadas sob responsabilidade da empresa são representadas na mesma coloração da camada de core
business.
Capítulo A4
Figura A 6.2. A rquitet ura de Sof tware “A nêmica”.
- Arquitetura de Software Intermediária
Neste estágio de maturidade, já encontramos evidência clara de uma primeira “Arquitetura de Software
Corporativa” em versão razoável, integrando um bom número de insumos (frameworks e utilitários)
Open Source com um esforço suficiente na produção de padrões de alto nível, nas diversas camadas
MVC.
Figura A 6.3. A rquitet ura de Sof tware Corporativa em nível intermediário.
Mas para ser de “nível intermediário”, realisticamente, esta arquitetura irá requerer uma compro vação de
uso satisfatório em produção – seguido das inevitáveis refatorações - por pelo menos dois anos. É um
período mínimo, após a construção da primeira versão, durante o qual uma equipe de perfil abrangente *
conseguirá evoluir para este nível de maturidade.
* C ompos ta de A rquiteto de Software, A nalistas de N egócio, Web - D esigners, P eritos nas T ecnologias, D oc umentadores, A nalistas de
T es te etc.
Entendendo a Arquitetura de Desenvolvimento
A partir deste ponto, no entanto, este modelo começa a apresentar suas limitações, especialmente se a
implementação arquitetural for concebida e desenvolvida totalmente por equipe interna:
o
Desvio de Foco: Uma equipe de valor estará dedicando boa parte de seu tempo em atividades
totalmente fora do foco do negócio, já que grande parte da solução arquitetural não é diferencial
para seu negócio.
o
Aumento de Custo: Mesmo que haja uma contratação de terceiros para a manutenção desta
camada, perdem-se os ganhos de escala possíveis a partir do reúso da parcela “commodity” da
arquitetura.
o
Problemas de Gestão: Normalmente, os problemas se agravam na medida em que começa a
existir uma “base instalada” da arquitetura em produção. Na fase de manutenção, requisitos
de Gerência de Configuração passam a consumir uma grande parcela de esforço da
equipe interna para manter ramos “de evolução” em paralelo com ramos “compatíveis”. A
partir daí, não é incomum que o entusiasmo técnico das primeiras fases dê lugar a turn-overs ou
queda considerável de produtividade.
A percepção mais comum é de que há uma dificuldade de ordem prática para que esta solução “familiar”
evolua para o próximo passo. Na medida em que as pressões de negócio sobre aplicações implantadas
prevalecem como prioridade, como haverá de ser, há uma tendência à estagnação ou lentidão para a
incorporação de inovações, medo de reformulações, etc.
- Arquitetura de Software Madura
Do nosso ponto de vista, uma primeira configuração de arquitetura rica e abrangente o suficiente para
oferecer os retornos esperados de um ambiente OO está ilustrada na Figura A6.4.
Figura A 6.4. A rquitet ura de Sof tware Corporativa com alto nível de maturidade.
Neste estágio, as preocupações de nível arquitetural que não sejam absolutamente dependentes do
contexto específico da empresa são totalmente desacopladas de preocupações de natureza comum ou
commodity.
Este é o primeiro modelo que oferece um importante raciocínio de negócios: a potencial terceirização
das camadas arquiteturais “2” e “3”, horizontais, de forma a possibilitar a concentração da
organização nas camadas “4” e “5”. De fato, somente as duas últimas têm relevância para o
ambiente específico de TI e verticais de negócio.
Com esta possibilidade, aumenta-se não somente o foco no negócio. Diminui-se o custo e herda-se
qualidade e maturidade, abreviando-se longos anos e um grande número de problemas.
- Arquitetura de Software Provida pelo jCompany FS Framework
Se tomarmos como base somente a proposta do módulo jCompany FS Framework, que provê uma
solução arquitetural para as aplicações desenvolvidas, veremos como ela pretende apoiar o modelo
anterior, oferecendo ganhos nas três camadas arquiteturais:
Capítulo A4
Figura A 6.5. A rquitet ura em camadas de uma aplicação Java EE com o jCompany Full Stack Framework.
O apoio ao problema arquitetural do jCompany FS Framework se dá de forma diferente, em cada
camada da arquitetura:
o
(2) Redução do trabalho de integração e pré-configuração da camada de reúso Open
Source. Com isso, a empresa se liberta de manter partes de prospecção (P&D), integração,
especialização, documentação de integração, atualização, controle de versões e gerência de
configuração para estes insumos.
o
(3) Implementação completa e madura para a camada “commodity”, baseada em Design
Patterns de mercado. Com isso, a empresa se liberta de conceber, manter e evoluir “a parcela
horizontal” da arquitetura de software e de amadurecê-la internamente.
o
(4) Solução de base para a criação da camada específica da empresa, chamada camada
Bridge. Deste modo, arquitetos da empresa podem imediatamente codificar suas generalidades e
especializações de “última milha”, sobrepondo ou especializando artefatos da camada (c). Este é
um espaço concreto que possibilita a criatividade, customização e generalização que dependem
do contexto da empresa (segurança, web-design etc.)
- Outras Soluções Arquiteturais do jCompany Developer Suite
Mas é importante notar que, além do jCompany FS Framework, os módulos jCompany IDE e
jCompany Test for Developer também trazem soluções arquiteturais para outras dimensões do
processo de desenvolvimento de software: ferramental/ambiente de apoio à produtividade e soluções de
base para Testes de Unidade, respectivamente.
Estas arquiteturas também podem ser expandidas e foram descritas no capítulo 1, mas estão
reproduzidas nas Figura A6.6 e Figura A6.7, para conveniência:
Entendendo a Arquitetura de Desenvolvimento
Figura A 6.6. A rquitet ura de Sof tware do A mbiente de Desenvolvimento (IDE).
Figura A 6.7. A rquitet ura de Sof tware para desenvolvimento de Testes de Unidade.
- A Síndrome do NIH (Not Invented Here)
Apesar dos ganhos óbvios advindos do reúso de arquitetura, um entrave a esta inexorável evolução pode
estar no próprio corpo técnico - por mais paradoxal que pareça.
Um indivíduo com interesse e formação em tecnologia, quando confrontado com um raciocínio de
negócios, pode falhar em identificar commodities de software, falhando em oportunidades de
terceirização que são chaves para o negócio de sua empresa. Uma atitude sintomática destes casos, por
parte de um arquiteto ou desenvolvedor, é rotular arquiteturas (nunca as suas próprias!) de “camisas de
força”, por exemplo *.
Todo reúso exige esforço de compreensão e adesão ao que se deseja reutilizar, em um primeiro momento, e
deve possibilitar diferenciações e flexibilidade para ganhos em níveis mais altos. Isso vale para o reúso de
arquitetura, de objetos ou de componentes.
- Aprendendo a Reusar Arquitetura
Sendo, portanto, o reúso em nível de arquitetura a primeira arma de produtividade e qualidade de
ambientes Orientados a Objetos, será essencial adquirirmos conhecimento nesta área, para os próximos
níveis.
*
São o que Rod J ohs on, o c riador do Spring , c hama de “O wn C areer D riven A rchitects” [J ohnson, Rod 2 0 04] - indivíduos que não
c ompreendem a importância, para s ua empres a, de orientarem a s ua “c riatividade” para c amadas de negóc io. É a ins is tência em não
reus ar, pelo des afio (ou interesse) pessoal de fazer.
Capítulo A4
Neste capítulo, recapitularemos brevemente alguns fundamentos no campo da arquitetura de software
para nivelamento. Não há pretensão e nem possibilidade de esgotarmos o assunto neste espaço, mas os
pontos para discussão aqui selecionados procuram se concentrar em carências frequentemente
encontradas em nosso mercado.
Revisão de Fundamentos
- Como Representaremos a Arquitetura?
Um sistema de software corporativo é composto de muitas estruturas distintas, com relacionamentos
complexos. Portanto, são necessárias diversas visões para representar cada uma delas [TS-4619
JavaOne 2006]. Neste livro, iremos discutir as seguintes visões arqu iteturais:
o
“Visão Geral” (General View): Utilizaremos a Visão Geral para uma primeira representação
(macro) das grandes camadas (Layers) e Blocos (Tiers) da arquitetura.
o
“Visão de Módulos” (Module View): Utilizaremos a Visão de Módulos para representar como
estão agrupados os conjuntos de artefatos em tempo de desenvolvimento e como eles se
relacionam entre si, em vários níveis de detalhamento.
o
“Visão Interna” (Interna View): Utilizaremos a Visão Interna para representar como estão
organizados os projetos de desenvolvimento do ponto de vista de sua estruturação interna. É um
tipo de visão de “micro-arquitetura”, considerando organização dos pacotes e artefatos padrões
definidos.
o
“Visão Comportamental” (Beauvoir View): Utilizaremos a Visão Comportamental para
representar como as categorias de classes colaboram entre si em algumas anatomias de
requisição MVC-P típicas.
o
“Visão de Execução” (Runtime View): Utilizaremos a Visão de Execução para representar
como podemos embalar e liberar os conjuntos de componentes em tempo de execução,
distribuindo-os ou mantendo-os em co-habitação, e como eles se relacionam nestas possíveis
variações de infra-estrutura.
o
“Visão da Interface com o Usuário” (GUI View): Utilizaremos a Visão de Interface com o
Usuário para representar os padrões de leiautes, formulários e componentes disponíveis, como
estão organizados e interação entre si. Ela não contempla questões de usabilidade, discutidas
fora do âmbito da arquitetura.
Além das representações principais para as visões acima, o detalhamento da arquitetura requer
documentos mais extensos que, por motivos didáticos, não são disponibilizados neste livro. Eles estão
disponíveis na documentação do módulo “jCompany Patterns & Methods”, cedido com a licença
corporativa do jCompany.
Neste capítulo, apresentaremos as três primeiras visões: "Geral", "de Módulos" e “Interna”.
- Arquitetura em Camadas (Layers)
O agrupamento de classes em módulos, que por sua vez se organizam em camadas sobrepostas, um
sobre o outro, é uma das metáforas mais comuns em arquiteturas de software. A estes módulos,
organizados rigorosamente desta forma, chamamos Layers (Camadas).
É um paradigma que define dependências de uma maneira simples (a camada de software “de cima”
depende da “de baixo”), mas que nos oferece um padrão para realizar arranjos arquiteturais bastante
complexos, mas que ainda assim conseguimos compreender – o que é, aliás, um dos grandes objetivos
de uma arquitetura OO.
O MVC, em si, é uma arquitetura em camadas cujo intuito principal é separar implementações
relacionadas à interação com o usuário (preocupações da aplicação em si) das implementações que
representam as regras de negócio fundamentais do negócio.
Para tanto, define uma camada “controladora”, que desacopla as camadas de Interface com o Usuário
(View ) da de negócio (Model), e também encapsula algum tipo de implementação em seu nível de
intermediação.
Na prática, algumas dificuldades que percebemos no uso do MVC em Java EE são:
o
Erros fundamentais de acoplamentos indevidos entre as camadas;
o
Uso burocrático, concebido para lidar com problemas intrínsecos do EJB 2.x, sem considerar
evoluções tecnológicas tais como o Java EE 5 e 6 e EJB 3.0 e 3.1;
o
Pouco investimento em generalizações OO, levando à proliferação desnecessária de grande
quantidade de código “pró-forma” (repetitivo), de comunicação entre as camadas.
Iremos discutir conceitos nestas três áreas, a começar pela questão das camadas:
Entendendo a Arquitetura de Desenvolvimento
o
Organização com baixo acoplamento em Layer (Camadas Sobrepostas): Uma
organização em Layer possui camadas sobrepostas “uma sobre a outra”, de modo que uma
camada somente dependa da imediatamente inferior. Por ter menos dependências, cada
camada tende a ser mais estável e flexível. Esta organização é também conhecida didaticamente
como “bolo de festa”, em analogia às diferentes camadas de recheio que compõem este tipo de
bolo:
Figura A 6.8. Organização em camadas.
o
Organização em Referência Circular: Muitas vezes uma representação errada ou pobremente
simplificada pode nos conduzir a conclusões perigosas nesta área. Por exemplo, a representação
à esquerda da Figura A6.9 representa módulos que não estão organizados em camadas, mas
que, devido à omissão das setas de dependência, sugere esta organização.
Olhando a revisão à direita, real, percebemos que se trata de uma arquitetura muito mais
complexa que a sugerida à esquerda. Neste caso, inclusive mais instável, pois sofre de um mal
conhecido como “referência circular”. Este é um problema que gera alto acoplamento e deve ser
evitado em todas as camadas de abstração de um software.
Figura A 6.9. Diagramação excessivamente simplif icada de arquitet ura.
o
Organização de Tier (Blocos), com diagramação simplificada: Mas a organização em
camadas não é a única utilizada em software e nem sempre é a mais recomendável. Pode-se
organizar uma aplicação em "blocos ou módulos" (Tiers) que não são "isolantes" como as
camadas, mas ainda assim relacionam entre si de modo a manter baixas as dependências.
Obs.: Mesmo nestes casos, muitas vezes a diagramação em camadas é utilizada, para
simplificar o diagrama em si, ou enfatizar um comportamento. Por exemplo, a diagramação da
esquerda, na Figura A6.10, é mais simples; mas quando é exigido um rigor técnico, pode dar
margem a confusão. Repare a versão mais exata à direita, exibindo claramente que C
dependente diretamente de A e B.
Capítulo A4
Figura A 6.10. Melhor diagramação de camadas.
o
Camadas paralelas e ortogonais: Como as organizações de software são bem mais
complexas do que pode sustentar a metáfora do “bolo de festa”, no mundo real nós iremos nos
deparar com combinações mais sofisticadas das várias abordagens possíveis, ou várias
“dimensões de camadas”.
Nas Figura A6.11 e Figura A6.12 vemos duas combinações em camadas “reais” que produzem arquiteturas
estáveis, corretamente diagramadas, e inclusive muito comuns em software.
Figura A 6.11. Camadas paralelas.
Figura A 6.12. Duas camadas transversais ou ortogonais.
Mesmo em uma arquitetura mais elaborada, como no caso da Figura A6.12, é importante percebermos
que o raciocínio fundamental de “minimizar dependências através do us o de camadas” continua presente.
Mas quais são os critérios para definirmos nossas camadas ? O que cada camada irá conter e como
dependerão umas das outras? Bom, estas respostas serão obtidas a partir de um raciocínio OO que
deverá seguir inicialmente os velhos princípios de baixo acoplamento e alta coesão.
- Baixo Acoplamento (Menos dependências, mais estabilidade)
O baixo acoplamento (ou diminuição das dependências entre elementos) deve ser almejado em
estruturas de software em todos os seus níveis de abstração:
Entendendo a Arquitetura de Desenvolvimento
o
Estruturas arquiteturais com o mínimo de dependências
(Na prática, com o maior uso possível de “camadas”);
o
Aplicações ou módulos com o mínimo de dependências (referências externas)
(Na prática, projetos com o menor tamanho possível de “Class Path”);
o
Pacotes com o mínimo de referências externas
(Na prática, classes com o menor número possível de “imports”);
o
Classes com menor número de referências externas possíveis
(Na prática, pacotes com o mínimo de classes possível).
Na implementação, classes que possuem menos dependências tendem a ser mais simples de se
compreender e mais “estáveis”, menos sensíveis a “turbulências” externas. Classes de camada
Controller, por exemplo, tendem a possuir mais dependências, tais como interfaces de Servlet e de
frameworks como o JSF. Tendem, portanto, a ter mais “imports” que classes da camada “Model” ou
“Domínio” e a serem mais instáveis (Por isso, dentre outros motivos, não são boas candidatas para
conterem implementações importantes do negócio ).
Mas como será que isso se manifesta realmente, na prática? Vamos ilustrar com o pequeno episódio real.
C erta vez, uma contribuição a um release menor do Tomcat 5.x introduziu a exigência de declaração
“implements Serializable” para todos os objetos que fossem mantidos em sessão (a intenção da equipe do
Tomcat era atender a um aprimoramento de suporte a Clusters).
As únicas classes que realizavam registro em sessão eram, naturalmente, as que possuíam acesso
(dependência) a interfaces de Servlet. Apesar de ser uma mudança trivial nos objetos (uma simples
declaração), em várias situações de migração para Tomcat 5.x, em todo o mundo, algumas classes de controle
“escapavam” à revisão e cancelavam em produção, manifestando a “instabilidade” provocada por esta
dependência.
É um típico problema produzido em camadas mais baixas da arquitetura que não acontece nas superiores
(de negócio, por exemplo), graças à organização em camadas do MVC.
- Alta Coesão (Melhor encapsulamento, maior reúso)
Sob outro ângulo, queremos também que estruturas, nos seus diversos níveis de abstração, se
mantenham especializadas, encapsulando implementações de comportamentos de mesma afinidade e se
mantendo tão simples quanto possível em torno de um objetivo comum.
Em tempo de programação, métodos que implementam mais de uma funcionalidade tendem a ser mais
confusos de se entender, manter e reutilizar. O mesmo ocorre com classes que agrupam blocos de
funcionalidade distintos, e assim por diante.
Pela nossa experiência, os maiores "crimes de baixa coesão” ocorrem nos métodos “de partida” , que iniciam a
resposta a um evento externo. Exemplos são o método “doGet” de um Servlet ou o “contextInitialized” em uma
implementação de ServletContextListener, ou um “execute” de um DP Command, utilizado em um framew ork
qualquer. Nestes pontos da arquitetura, não é difícil encontrarmos verdadeiros programas “COBOL”, em sintaxe
Java!
- Fatoração de Código (Menos redundâncias, mais eficácia)
A “fatoração de código” consiste na identificação de códigos redundantes ou muito similares em
diferentes artefatos, extração da parte comum deste código para um novo artefato independente, e
revisão dos originais para reusarem o código extraído “colocado em evidência”.
O objetivo do arquiteto, neste quesito, é buscar por códigos “pró -forma” (boiler plate) recorrentes,
vulgarmente conhecidos como “código burro” e aplicar seus conhecimentos de arquitetura de software e
OO para eliminá-los, possivelmente promovendo-os para frameworks ou utilitários.
Fatoração de código “pró-forma” é, de longe, uma das questões da arquitetura que mais afetam a
produtividade e um dos objetivos principais de frameworks de integração!
Uma arquitetura onde são admitidas grandes quantidades de “código burro”, por limitações de tempo ou
de conhecimentos mais aprofundados de OO e Java, fracassará ao menos parcialmente. Se não na
primeira versão da aplicação, nas fases seguintes, com as insustentáveis manutenções.
- Refatoração de Código (Fatoração contínua)
“A melhor escrita é a reescrita (...). Todo bom escritor sabe disto, e isto é verdadeiro para software também”
Ref . A 6.4. Paul Graham, citando E. B. White, em Hackers and Painters [Graham, Paul 2004]. Pág. 212
Mais recentemente, a “fatoração de código” deu lugar a uma sucessora: a “refatoração de código”
(Refactoring).
Capítulo A4
Bastante discutida por autores diversos com destaque para Kent Beck e Martin Fowler [Fowler, Martin
2004] e automatizada até certo ponto em IDEs tais como Eclipse , esta mudança de ênfase para a
refatoração faz sentido na medida em que admitimos a dificuldade de se produzir códigos bem fatorados,
“de saída”.
A verdade que hoje conhecemos é que, ao contrário do que alguns metodologistas eminentemente
teóricos apregoam, dificilmente se obtém uma boa arquitetura na sua primeira versão.
Especialistas nas tecnologias e processos de Especificação (CASE UML, Ferramentas MDA etc.), mas que
pouco ou nada conhecem das tecnologias e processos de Construção, terão ainda mais dificuldade neste
objetivo. Portanto, será prudente partir de preceitos arquiteturais que visem facilitar a “refatoração ou
reformulação de códigos” de uma forma geral, com a produção do mínimo de instabilidade possível.
Uma boa arquitetura é obtida de explorações práticas seguidas de refatorações freq uentes, oportunidades que
somente são bem aproveitadas por arquitetos de software hands-on, que se atrevem a “por a mão na massa”.
- Arquitetura de Software proposta no jCompany
O estado atual da arquitetura proposta no jCompany é fruto de uma boa amostra de projetos reais, com
fases de refatoração decisivas baseadas em problemas e sugestões reais de clientes. Apesar de não ser
perfeitamente ajustada para problemas de A até Z, contém soluções para um “mínimo denominador
comum” que cobre um grande intervalo de problemas com soluções generalizáveis.
No estágio atual da arquitetura do jCompany, por exemplo, não é mais requerida nem uma única linha
de código Java, em nenhuma das camadas do MVC, para se implementar “Manutenções de Ciclo de Vida
de Objetos” (incluir, alterar, excluir e consultar).
Mesmo quando lidamos com agregações de objetos complexas, envolvendo cinco, dez ou até vinte
classes, o total de linhas de programação procedimental MVC para se obter um resultado com qualidade
de produção no jCompany tende a “zero”!
Manutenções de objetos em sua forma básica são operações commodity, candidatas primárias à fatoração de
código em qualquer linguagem de programação, especialmente em linguagens OO tais como Java, e não
deveriam ser resolvidas primariamente com geração de código - “rapidez” que não se preserva nas
manutenções.
Mas, indo além destas operações de manutenção de ciclo de vida, o jCompany generaliza por inteiro
dezenas de outras programações sofisticadas e recorrentes em sistemas corporativos, tais como
“clonagem de documentos”, “assistentes”, “leiaute dinâmico para impressão”, “exploradores de dados
(treeview)”, “exportação de dados”, e muitas outras. Todas elas generalizações que preveem espaço para
especializações em nível corporativo ou em nível de Caso de Uso, respeitando a arquitetura MVC.
Iremos experimentar estas promessas na prática, no próximo módulo. Neste capítulo, vamos apresentar
a "Visão Geral", “Visão de Módulos” e “Visão Interna” da arquitetura de software proposta pelo
jCompany.
“Visão Geral” - Grandes Camadas e Blocos da Arquitetura do Framework
- Visão Geral da Arquitetura do jCompany FS Framework
Já apresentamos uma visão geral de toda a solução jCompany Developer Suite, no capítulo 1. Iremos,
na pauta atual, somente aprimorar a representação da arquitetura do framework jCompany FS
Framework, que representa a dimensão da solução de maior interesse por parte de Arq uitetos de
Software, já que inclui os componentes OO reutilizados e montados juntamente com as aplicações.
A representação inicialmente apresentada no capítulo 1 está repetida na Figura A6.13, para conveniência.
Os números de 1 até 4 representam dependências existentes para reúso, desde a infra-estrutura,
passando pelos serviços do Application Server, bibliotecas, frameworks de base, framework de integração
e camada Bridge.
Entendendo a Arquitetura de Desenvolvimento
Figura A 6.13. Visão Geral inicial da arquitet ura do jCompany FS Framework.
Mas, mesmo sendo macro, esta representação é muito simplória para estudos arquiteturais. Isto porque
nem a camada “3”, do jCompany (Arquitetura Reutilizada), nem a camada “4, Bridge (Arquitetura
Específica), funcionam como Layer, todo o tempo, como o diagrama pode sugerir.
Exceto nos percentuais de requisitos onde os Casos de Uso Padrões são suficientes, o desenvolvedor
poderá (e isto será desejável) acessar a camada “2” (JBoss Seam, Tiles/Facelets, JPA/Hibernate, etc.)
diretamente ou, mais raramente, a camada “1”, em nível do Application Server ou JVM.
Portanto, o diagrama abaixo é mais realístico tecnicamente falando do que o anterior.
Figura A 6.14. Visão Geral da A rquitet ura do jCompany FS Framework - A primorada.
#1.
Nas parcelas de requisitos de Casos de Uso centrados em dados, tanto o jCompany FS Framework
quanto a complementação Bridge praticamente isolam a aplicação das camadas de baixo, atuando como
camadas (Layers). É importante notar as setas tracejadas de dependência, indicando que estas "camadas"
comunicam entre si para oferecer um resultado MVC completamente generalizado.
#2.
Em requisitos que fogem ou suplementam os suportados pelos padrões, o acesso pode ser direto à camada
de frameworks de base. Deste modo, a arquitetura não restringe; possibilita ao desenvolvedor elaborar
quaisquer soluções que sejam convenientes, para cada caso.
Em quanto por cento dos casos o jCompany FS Framework e a Bridge funcionarão como camadas? Bom,
isso depende da natureza dos requisitos de cada projeto. Em um estudo de ROI (Retorno sobre o
Capítulo A4
Investimento) elaborado pela Powerlogic, a torta apresentada na Figura A6.15 é tomada como base,
para um projeto corporativo típico.
Figura A 6.15. Segmentação típica de requisitos de aplicação corporativa.
Assim, em 40% dos casos, em média, espera -se que o jCompany FS Framework atue como uma
camada, evitando contato direto de códigos de negócio com frameworks de base.
Nos demais segmentos de requisitos, o framework irá contribuir provendo serviços de IoC, DI, AOP para
gerência de transações, leiautes etc.; todos bastante úteis, mas que não visam isolamento. Deste
modo mantém-se a liberdade para que o desenvolvedor acesse qualquer recurso de base, quando
necessário for.
Veja a contribuição esperada (também em média, é claro) para cada fatia de natureza de requisitos,
acima definida, na Figura A6.16.
Figura A 6.16. Percentual de contribuição do jCompany FS Framework, por natureza de requisitos.
Quando funciona como camada, o nível de contribuiçã o do framework do jCompany no estudo foi
impressionante. Mas mesmo considerando-se o percentual de contribuição nas outras fatias,
devidamente ponderados, obtém-se ganhos expressivos!
"Visão de Módulos” - Dependência entre os projetos gerados
- A arquitetura MVC no jCompany
Veja que, no tópico anterior, a representação de camadas utilizada é ortogonal às camadas MVC. Neste
tópico, vamos "virar" em 90 graus o diagrama para analisá-lo deste outro ponto de vista.
A arquitetura MVC sugerida pelo jCompany sustenta-se por cinco pilares principais:
1.
Adoção rigorosa da arquitetura MVC-2.
2.
Uso de camada de Persistence, subdivindo a de modelo, através do DP DAO (ao que chamamos, resumidamente,
de MVC2-P)
3.
Balanceamento entre “melhores práticas” Java EE e DDD.
4.
Refinamento do nível de detalhe arquitetura, para dentro das camadas MVC2-P.
5.
Arquitetura rica, também para a camada Visão, com exclusivo “IoC Universal”, inclusive para esta camada.
De uma forma um pouco mais detalhada:
1.
Primariamente, o jCompany reúsa o modelo MVC-2 clássico com separação rigorosa das suas camadas
utilizando o servlet de “Front-Controller” do JSF (FacesServlet). O uso deste DP Front-Controller é o que distingue
o MVC-2 do MVC-1, já que no segundo caso o usuário acessa as JSPs diretamente.
Entendendo a Arquitetura de Desenvolvimento
2.
Em segundo lugar, o jCompany define uma nova camada para serviços de Persistence, subdivisão da
camada Model, provendo contratos abstratos (Interface e DP Abstract Factory), além de
implementações concretas genéricas e alternativas para Hibernate ou JPA. A camada de Persistence não
é uma sub-divisão “clássica” do MVC, mas como é um “layer” verdadeiro e muito comum no mercado, iremos
enfatizá-lo com a sigla MVC2-P.
3.
Em terceiro lugar, a arquitetura se desenvolve com base em recomendações da Sun, assimilando “melhores
práticas” do Core J2EE Patterns [Deepak Alur, John] atualizadas para Java EE 6, balanceadas ainda com
sugestões de Domain Driven-Design - DDD [Evans, Eric. 2004].
O DDD enfatiza uma organização OO tão pura quanto possível para o modelo de Domínio, o que concorre
eventualmente com organizações para código distribuído do Java EE. Algumas vezes o Java EE apresenta padrões
que apresentam pequenas otimizações, de mais baixo nível, mas que não são tão elegantes quanto um modelo
rico de Domínio preconizado pelo DDD.
Mas, se por outro lado uma arquitetura que enfatize uma “distribuição potencial” de componentes, como o Java
EE, pode ser considerada “overengineering” [Johnson, Eric 2002], por outro pode ser útil em e stratégias que
pretendam maximizar o reúso em runtime usando SOA, por exemplo.
A arquitetura sugerida no jCompany oferece um balanço razoável entre estas duas escolas : na prática,
isto significa que programações de Domínio podem ser ricas e “não anêmicas” [Fowler, Martin 2004],
refletindo uma linguagem de negócios, mas também publicáveis ao menor esforço e de forma eficiente
através de um WebService ou serviço EJB3 remoto - se, quando e onde preciso for.
4.
Em quarto lugar, o jCompany refina a arquitetura para “dentro de cada camada MVC2-P”, definindo uma
organização refinada de pacotes e novas categorias de classes internas tais como Service e Helper, utilizadas com
DP C omposite [Freeman, Freeman 2004] para maximizar a coesão e minimizar ainda mais o acoplamento.
5.
Finalmente, o jCompany possui uma arquitetura especialmente diferenciada na camada Visão, provendo
Inversão de Controle (IoC), também nesta camada, de modo a finalizar a abrangência de generalização potencial
da solução.
Como vimos, esta é uma camada especialmente mal resolvida em arquiteturas típicas do mercado,
devido à sua complexidade e diversidade de tecnologias (JSF, Tag-Files, JSTL, JSP, Tiles/Facelets,
Javascript, CSS, DHTML, Ajax/DOJO etc.). Para fazer frente a este desafio, o jCompany define leiautes
reutilizáveis e controlados pelo framework (leiautes dinâmicos com Tiles /Facelets), componentes visuais
especializados, soluções para reúso e especialização de peles, rotinas Javascript/Ajax etc., tudo isso com
DPs e conceitos OO aplicados, como nas demais camadas. Este assunto será discutido de forma
específica em capítulo sobre customização de Web-Design.
- Organizando Classes de Domínio
Uma das maiores discussões arquiteturais em MVC é, frequentemente, “como organizamos o nosso
modelo de Domínio”?
O modelo de Domínio é composto por aquela parcela de classes que representam entidades claramente
identificadas no negócio, persistentes, em sua maioria, contendo propriedades cujos valores devem ser
mantidos em bancos de dados.
Mas muito embora estas classes componham um núcleo importante das estruturas e regras de negócio,
existirão outras categorias importantes de classes também consideradas “de negócio” para encapsular
orquestrações de serviços, cálculos e procedimento de apoio.
- Arquitetura MVC-2 clássica do J2EE
Na visão original do J2EE, tais classes de domínio deveriam ser implementadas como Entity Beans e, pela
imposição de não poderem rodar fora de um container EJB (ao contrário dos POJOs atuais), eram, de
forma obrigatória, localizadas em subcamada interna da camada Model.
Até o aprimoramento recente do padrão da especificação de Entity Beans para o EJB3, portanto, era
recomendado aos desenvolvedores J2EE trabalhar com cla sses artificiais de DTOs (Data Transfer
Objects), meros containers de informações, para transportar dados de entidades da camada
Modelo/Persistence para a camada Controller/View, conforme a Figura A6.17.
Capítulo A4
Figura A 6.17. A rquitet ura MVC preconizada no J2EE clássico (até EJB 2.1).
#1.
Usuário aciona aplicação: No modelo MVC-2, um servlet recepciona todas as requisições do usuário (e
não os componentes de visão tais como JSF, no MVC-1)
#2.
Camada controller chama “serviços” de negócio: Um aparato de Design Patterns tais como Business
Delegate, Session Façade e outros são tipicamente utilizados para um maior isolamento entre a camada da
aplicação (Controle e Visão) e a camada de negócio (Model), e também devido a uma pressuposição de
“remoting”, ou seja, da potencial distribuição destas camadas por máquinas distintas, em runtime. Classes
remotas são, principalmente EJB Session Beans 2.x.
#3.
Todas as principais camadas compartilham utilitários. Muito embora não sejam representados com
frequência, componentes JAR contendo bibliotecas suplementares para operações com data, logging,
numéricas, tratamento de exceções etc., são dispostas de forma a estarem disponível em todas as
camadas.
#4.
Uso de Entity Beans 2.x: A Persistence ideal do ponto de vista da especificação é obtida através de
classes EJB Entity Beans e uso de linguagem EJB-QL.
#5.
Uso de Session Beans (DAO): Alternativamente, classes de EJB Session Bean substituem Entity Beans,
devido a limitações tecnológicas ou de performance, requerendo codificação de SQL diretamente nos
códigos Java.
#6.
Acesso a serviços de Persistence: Seja por responsabilidade do container EJB, no caso dos Entity Beans
ou do desenvolvedor nos DAOs, somente através de classes desta camada o repositório de armazenamento
(Ex.: SGBD-R) é acessado.
#7.
Criação do meio de transporte: Após a recuperação de informações persistidas, seja por que meio
forem, a codificação da cópia dos dados de Entity Beans ou JDBC Result Sets para DTOs (Data Transfer
Objects) é obrigatória.
#8.
Controle de fluxo de navegação: No modelo MVC-2, as classes de Controle decidem para que classes de
visualização irão delegar a finalização da resposta ao usuário. Uma nova versão de Interface com o Usuário
é então selecionada em função do estado atual da conversação.
#9.
Despacho da visualização: Classes representando tecnologias da camada Visão tais como facelets ou
JSF despacham algum formato de visualização para dispositivos de cliente, tais como HTML, XML, PDF, CSV,
etc.
Perceba que, como a estrutura de dados dos formulários de negócio é composta em sua maior parte por
propriedades das entidades do negócio, a estrutura das classes de DTO terminava por ser 90% a 100%
redundante com a estrutura das classes Entity Bean. Por conseq uência, a manutenção desta redundância
exigia códigos “burros” de transferência de dados (de ->para), instanciações de classes desnecessárias
etc.
Os outros graves problemas desta especificação Entity Bean (até a versão 2.x), tais como sérias
restrições da linguagem de Persistence EJB-QL, limitação ao uso de herança etc., findavam por
configurar um verdadeiro desastre em termos de produtividade - e Orientação a Objetos.
Na prática, muitos resolviam este problema simplesmente desistindo dos Entity Beans 2.x (de fato, quase
inutilizáveis). Mas quem não os substituía por algum framework de mapeamento Objeto-Relacional tal
Entendendo a Arquitetura de Desenvolvimento
como o Hibernate, passava a programar JDBC em EJB Session Beans, como exemplificado em (E), com
manipulação direta de “result sets” e cópias de/para DTOs (ou VOs), caindo em níveis de produtividade
de técnicas de programação da geração “COBOL”. Na verdade, em níveis piores devido às deficiências
intrusivas da geração EJB 2.x, como visto.
Felizmente, os Entity Beans 2.x são agora “legado”, s ubstituídos na versão EJB 3.0 por POJOs (Plain Old
Java Objects) que corrigem, da “água para o vinho”, todas as limitações clássicas.
Uma sequela disso é que os Entity Beans 3.0 foram inteiramente reconcebidos a partir do padrão Java EE
5 e o ramo 2.x não sofrerá mais evoluções. Ruim para quem acreditou cegamente neste tipo de “padrão
forçado de comitê”; bom para o restante do mercado, que já havia trocado o uso de Entity Beans 2.x por
alternativas que agora se tornaram o “padrão de -facto”, como o Hibernate/JPA*.
Padrões “de facto” do mercado Open Source, via de regra, superam os “de comitê”. Somente nos últimos anos,
os condutores estratégicos do Java EE 5 e Java EE 6, especialmente a SUN, focou nos anseios dos
desenvolvedores e não somente dos fabricantes de Application Server . Esta tendência tem levado à quase
eliminação de padrões artificais concebidos sem exploração técnica.
- Camada de Domínio Ortogonal em Java EE 6
Por tudo isso, em sua versão 3.x os Entity Beans voltam a ser a implementação ideal para Entidades de
Domínio. Os EJBs 2.x não eram recomendados para este fim pelos principais autores e adeptos do DDD,
tais como Martin Fowler e Eric Evans.
Dentre outras vantagens, os EJBs 3.x podem agora dispensar os DTOs na maior parte do tempo, pois são
“destacáveis” e podem ser expostos para todas as camadas do MVC2 -P em um esquema conhecido como
“atach-detach”. Deste modo, servem tanto para Persistence transparente quanto para encapsularem
regras de sua alçada e transportarem seus próprios dados.
Com esta evolução, uma melhor organização para entidades de Domínio é colocá -las em uma nova
camada, ortogonal à camada central do MVC [POJOs in Action] [Spring MVC], conforme ilustrado na
Figura A6.18.
Figura A 6.18. A rquitet ura MVC com camada ortogonal de Domínio.
#1.
*
Camada commons engloba utilitários e DTOs eventuais: As classes utilitárias comuns a todas as
camadas MVC principais, bem como eventuais DTOs que ainda sejam necessários são encapsulados na
visão “Commons”.
O c riador da Hibernate, G avin King, foi um dos líderes da es pecificação EJB3, es pec ialmente da parte de Entity Beans, que foi
redefinida dentro do padrão JPA (Java Persistance A rchitecture). P or is so, o J P A é hoje 9 0 % s imilar arquiteturalmente ao que já s e
us ava na H ibernate.
Capítulo A4
#2.
Camada de Persistence mais “leve”, utilizando JPA-QL: A camada de Persistence agora pode
dispensar codificação de inclusões, alterações, exclusões e de tratamentos de concorrência, geração de
identificadores automáticos, dentre outros trabalhos realizados de forma transparente pelo JPA. Além disso,
a linguagem JPA-QL retorna grafos de entidades de domínio prontamente disponíveis para uso pelas demais
camadas de forma OO, e não mais “result sets” JDBC, relacionais.
#3.
Camada ortogonal para Entidades de Domínio: A camada de domínio agora representa um objeto
clássico de OO, com propriedades e responsabilidades (métodos) do negócio, além de poderem ser
utilizadas em qualquer camada MVC2-P. É importante notar que agora as nobres classes desta camada são
as mais estáveis da arquitetura, não dependendo de serviços de nenhuma outra, nem de Persistence, por
exemplo (a camada de Persistence recupera dados e disponibiliza para a de Domínio).
Na camada simplificada como “Commons” (1) estão incluídas classes de utilitários comuns de base OSS
(Apache Commons, Apache Log4j etc.), do jCompany (classes sufixadas com Helper ou Util), os DTOs
restantes e, ainda, os contratos (as Interfaces, somente) de fachada, entre as camadas.
A Figura A6.19 mostra uma radiografia um pouco mais detalhada da Arquitetura de Software MVC2-P *
proposta para Java EE 6 pelo jCompany, exibindo também algumas dependências especificas de cada
camada, ao centro (Mat. Prima OSS, Service, Helper):
Figura A 6.19. A rquitet ura MVC2-P com dependências ortogonais globais e internas das camadas.
*
#1.
DP Façade: Apesar de representarmos, didaticamente, uma seta com dependência entre Controller e
Model (do Controller para a subcamada de implementação de Fachada), o DP Façade é utilizado nesta
interação, de modo que há um acoplamento leve, facilitando reimplementações de serviços, se/quando
necessário.
#2.
Transporte DTO e Context: Quando um Caso de Uso apresenta formulário com estrutura bastante
distinta das Entidades, pode-se lançar como recurso de transporte os tradicionais DTOs (Data Transfer
Objects), como exceção, não mais como regra! Além disso, um POJO com DP Context Object é utilizado
pelo jCompany para transportar, genericamente, informações de contexto da camada Controle para
Modelo, que podem ser úteis (perfil do usuário autenticado, metadados de colaboração etc.).
#3.
Utilitários Globais: Classes do jCompany com sufixo Helper trazem funções diversas, complementares a
funções de utilitários de mercado, de interesse de todas as camadas.
#4.
Matéria-Prima OSS Global: Representam dependências externas (JAR) de utilitários, também comuns a
todas as camadas MVC2-P, tais como Log4j, Commons, CGLib (AOP) etc.
N es te livro, utilizaremos M VC2-P quando quisermos enfatizar uma arquitetura MVC do tipo 2 , c om s ubc amada de P ersistência bem
definida.
Entendendo a Arquitetura de Desenvolvimento
#5.
Serviços e utilitários Específicos: Dentro de cada grande camada MVC2-P, há subdivisões de pacotes
segmentando e encapsulando serviços e utilitários internos do jCompany, específicos para a camada.
#6.
Matéria-Prima OSS Específica: Cada camada MVC2-P possui um conjunto agrupado de dependências
externas de interesse seu apenas (definido tanto no Maven quanto em User Libraries do Eclipse). Este
agrupamento simplifica a gestão de dependências, evitando falhas básicas de arquitetura produzida por
desenvolvedores. Ex.: Importações de serviços de Persistence na camada Controller.
É importante observarmos algumas dependências acima indicadas:
o
Há uma dependência ortogonal, por parte de todas as camadas MVC2-P, com a camada de
Domínio, além de utilitários comuns, resquícios de DTO e contratos de fachada (somente as
Interfaces).
o
A camada de Domínio, por sua vez, desconhece e independe de quaisquer das camadas MVC2-P.
Ela se torna assim, como é de se esperar, a parte mais estável da arquitetura, funcionando
com um “layer ortogonal”. O conceito da ortogonalidade pode ser melhor visualizado pelo
rearranjo didático da Figura A6.20.
Figura A 6.20. Rearranjo para visualização mais didática da camada Ortogonal - "layer".
Algumas outras observações importantes:
o
O M do MVC2-P, a camada Model, é agora decomposta em “Implementações de Contratos de
Fachada” e “Serviços de Negócio”. Não detém mais os direitos exclusivos de acesso às
Entidade de Domínio, que por sua vez também encapsulam “regras de negócio de sua
responsabilidade” e não somente dados.
o
Em uma eventual disponibilização de forma distribuída, os módulos que compõem as camadas
ortogonais são embalados em ambos os executáveis: o da aplicação e o do serviço. Ou seja,
em lugar dos DTOs artificiais (somente alguns contratos especiais permanecem), são
as próprias Entidades que agora servem de transporte entre as aplicações
distribuídas.
o
Entidades não podem acessar DAOs (Data Access Objects) para obter dados. Elas devem
receber dados recuperados por classes de serviço da camada Model (Manager/Business
Objects-BO ou Application Services-AS) para realizar seus processamentos, tipicamente
regras de negócio.
o
Os termos entre parênteses sugerem sufixos padrões para classes em cada camada, mas podem
ser customizados em nível corporativo através de configurações nos metadados do jCompany.
Assim, classes de serviço da camada Modelo podem ter sufixo padrão BO, Manager, Mgr ou
Service, conforme desejado.
- Organização de Projetos de Desenvolvimento
Os três projetos Eclipse gerados no capítulo anterior suportam a arquitetura MVC2-P, no ambiente de
desenvolvimento, da seguinte forma:
Capítulo A4
Figura A 6.21. Projet os de desenvolvimento x arquitet ura de camadas MVC-P.
#1.
Projeto Eclipse “rhtutorial”*: Engloba a chamada de “camada da Aplicação” [Richardson, Chris 2006], ou
seja, as camadas Visão e Controle (Controlador) do MVC. Naturalmente, artefatos de visão são
segmentados dos de controle em pacotes distintos.
#2.
Projeto Eclipse “rhtutorial_model”: Engloba a camada de Model, incluindo a subsegmentação de
Persistence em pacote distinto. Também neste caso, pacotes distintos segmentam serviços de negócio e de
Persistence.
#3.
Projeto Eclipse “rhtutorial_commons”: Engloba a camada de utilitários e outras classes de interesse
comum das demais camadas e também a camada de Domínio, segmentada em pacote específico.
Na organização da Figura A6.21, é importante notar que não há uma relação “um para um” entre uma
camada da arquitetura e um projeto de desenvolvimento na IDE, já que a proliferação de projetos de
desenvolvimento é também prejudicial, aumentando a complexidade muitas vezes sem
vantagens práticas.
Por outro lado, agrupar todas as camadas em um único projeto costuma também ser uma
simplificação exagerada na medida em que facilita a quebra de arquitetura MVC †.
O jCompany sugere um agrupamento considerado bom para a média dos projetos corporativos, em seus
templates INI, mas deve-se realizar ajustes, customizando-se estes templates para algumas situações.
Alguns bons exemplos são:
o
Caso a aplicação pretendesse renderizar objetos para mais de uma tecnologia de Visão (Ex.:
HTML e também XML/XSLT ou WML), então seria uma boa escolha separar os pacotes de Visão,
presentes no projeto “rhtutorial”, em outro projeto independente. Deste modo, poder-se-ia ter
dois projetos para esta camada Visão bem desacoplados.
o
O mesmo raciocínio valeria, caso a pretensão fosse utilizar duas implementações de Persistence.
Se fosse o caso, compensaria fatorar o(s) pacote(s) de persistencia do “rhtutorial_modelo” para
um projeto próprio de Persistence‡.
*
N a vers ão 6 .0 do J A GUAR os projetos M VC s ão gerados s ob um projeto pai nomeado c omo "[nomeapp]_parent". E ssa nova estrutura
fornec e maior dinamis mo para o maven e não interfere em nenhum artefato M VC.
†
I s s o porque fac ilita aos des envolvedores eventualmente instanciarem dependência s de outras c amadas, dis poníveis globalmente em
um únic o C lass P ath.
‡
N ote que, des de que c las ses de uma c amada M VC2-P estejam s egmentadas, pelo menos , por pac otes c om baixo acoplamento,
reorganizar os projetos não s eria uma tarefa c omplexa. E c omo veremo s, es ta é uma preoc upação do jCompany, que des c reveremos
na “V is ão I nterna” da arquitetura proposta.
Entendendo a Arquitetura de Desenvolvimento
Figura A 6.22. Principais pacotes que segmentam internamente as camadas, dentro de projet os.
Devido à organização acima representada, chega -se ao seguinte esquema de dependência entre os
projetos gerados (gerada desta forma pelo jCompany, automaticamente, tanto no Eclipse quanto no
Maven):
Figura A 6.23. Diagrama de dependência de módulos em linguagem UML.
Nos exemplos em Figura A6.24, Figura A6.25 e Figura A6.26, vemos os arquivos Maven e configurações
no Eclipse envolvidos. Os módulos Maven (Projetos que serão alterados e construídos pelo
desenvolvedor) são definidos no arquivo "pom.xml" do projeto Parent e as dependências Maven nos
arquivos "pom.xml" de cada projeto. A sincronia entre esta definição e o Build Path do Eclipse é
automaticamente realizada pelo plugin M2Eclipse. Notar que este plugin importa "módulos Maven" como
"Projetos Eclipse" e, como veremos mais adiante, outras dependências (JAR) como Libraries Externas,
como deve ser feito:
Capítulo A4
Figura A 6.24. Projet o "principal": Módulos expressos no "pom.xml"
Figura A 6.25. Projet o "principal": Dependências de módulos expressas no "pom.xml" e sincronizadas no Eclipse.
Figura A 6.26. Projet o "modelo": Dependências de módulos expressas no "pom.xml" e sincronizadas no Eclipse.
O projeto "commons" não possui dependência dos demais, sendo portanto considerado mais "estável", do
ponto de vista arquitetural.
- Dependências com o jCompany
A Figura A6.27 exibe novamente um Diagrama de Componentes da UML para nosso projeto “rhtutorial”,
desta vez expandido para conter dependências do jCompany em tempo de desenvolvimento (no
Eclipse).
Figura A 6.27. Dependências entre projet os gerados e jCompany, em tempo de desenvolvimento.
O projeto do jCompany para camada de Visão, “jcompany_view” não esta incluído como dependência
porque não contém classes necessárias em tempo de desenvolvimento. Mas caso o desenvolvedor
Entendendo a Arquitetura de Desenvolvimento
necessitasse especializar algum componente ele teria que acrescentar uma camada “Bridge”
especializada ao projeto.
- Dependências com o jCompany “em tempo de desenvolvimento”
Como implementamos as dependências da Figura A6.27, no ambiente do Eclipse?
Além dos módulos supra-citados, o plugin M2Eclipse sincroniza as dependências simples, que não são
expressas como "módulos" nos arquivos "pom.xml"(do projetos MVC e do projeto Parent) ,como
"External Libraries" no Eclipse, automaticamente. Deste modo, dispensa o desenvolvedor de configurar
de forma redundante estas dependências. Ver Figura A6.28.
Figura A 6.28. Dependências automaticamente geradas no Eclipse, a partir do M2Eclipse
#1.
Projetos Rhtutorial, que por ser um projeto jCompany tem dependências gerenciadas pelo M2Eclipse.
#2.
JARs definidos nos arquivos "pom.xml" e disponíveis no repositório Maven local, agrupados em "Maven
Dependencies".
- Dependências com o jCompany “em tempo de execução”
Em uma visão de dependência “em tempo de execução”, o projeto da camada Visão, “jcompany_visao”
devem aparecer, pois reúne artefatos "não Java", com conteúdo em formatos como XHTML (leiautes
genéricos de formulário), CSS, Javascript (Widgets, utilitários, ...), dentre outros artefatos reutilizados
somente em tempo de execução. Isto é exemplificado na Figura A6.29.
Figura A 6.29. Dependências entre projet os gerados e jCompany em tempo de execução.
Obs. 1: Para dependências somente em “tempo de execução”, é necessário o devido registro das
dependências nos arquivos “pom.xml” do Maven, mas não necessariamente no Eclipse! O M2Eclipse já
cuida deste tipo de configuração automaticamente.
Obs. 2: Os projetos da camada visão do jCompany são disponibilizados como “WAR” para o Maven, que
os expande e mescla com o WAR da aplicação (ou EAR) em tempo de montagem para funcionamento em
execução. Este formato é modelado como "PSEUDO-WAR" para distingui-lo de um "WAR" final,
executável.
Capítulo A4
- Dependências com a camada de reúso Open Source (OSS)
Além da dependência entre os projetos Eclipse e o jCompany, precisaremos analisar e implementar
ainda as dependências de todos estes projetos com os frameworks de base e bibliotecas de utilitários
homologados no solução, aos quais chamamos de “Matéria -Prima Open Source”.
As dependências das camadas de reúso Open-Source também são importadas como "External Libraries"
no Eclipse pelo M2Eclipse, não havendo distinção com relação aos JARs do jCompany, por exemplo.
Figura A 6.30. Libraries contendo jCompany e componentes reutilizados (em destaque), gerados pelo M2Eclipse.
“Visão Interna” - Estrutura e artefatos dos projetos gerados
- Introdução
Nesta visão, vamos entender como os três projetos gerados no cap ítulo anterior estão organizados do
ponto de vista de sua estrutura interna. Esta visão engloba a organização de diretórios e de artefatos
sugeridos pela arquitetura.
A organização inicial de diretórios adotada pelo jCompany segue convenções recomendadas pela
ferramenta Apache Maven, resultado de anos de prática em organização de projetos colaborativos e
mundiais do grupo Apache. A organização “opinativa” do Maven, como gostam de frisar os seus autores,
é mais rigorosa, porém permite a esta ferramenta compreender mais a fundo o projeto (onde estão suas
classes de teste, artefatos de configuração da aplicação etc.) e, por consequência, contribuir mais.
Seguir o padrão de pacotes do Maven nos ajudará na atualização de versões, geração de
rotinas de montagem, compilação e liberação de executáveis. Além disso, plugins Maven poderão
gerar métricas interessantes e um Web-Site em nível bem adiantado de acabamento para nossos
projetos, uma vez que utilizemos a sua “arquitetura sugerida”.
A postura “opinativa” do Maven é similar à adotada pela Powerlogic no jCompany. O Maven aprofunda as
exigências arquiteturais e irá cobrar um maior investimento inicial quando comparado, por exemplo, ao Apache
Ant, mas trará mais retorno, no médio prazo.
- Aprendendo mais sobre o Apache Maven
Não iremos redundar neste livro toda a explicação de base disponível nos manuais do “Maven 3”, sobre
as vantagens da estrutura de pacotes sugerida adotada pelo jCompany. Para isso, sugerimos estudo dos
tutoriais do produto em www.maven.apache.org/guides ou dos diversos artigos disponíveis na Web,
facilmente desvendáveis através de consulta “maven 3 articles” no Google.
Em nossa pauta, iremos discutir os refinamentos realizados pelo jCompany sobre essa estrutura padrão
de forma detalhada.
- O projeto principal (Controller e View)
O projeto “principal” contém basicamente pacotes para programações da camada Controller
do MVC, bem como arquivos de configuração e artefatos de camada Visão. É a seguinte a sua
organização interna padrão, conforme definida no template INI (e, portanto, utilizada para novos
projetos):
Entendendo a Arquitetura de Desenvolvimento
Figura A 6.31. Organização interna do projet o principal “rhtutorial”.
Organização Interna do Projet o Principal (Ex.: rhtutorial)
P ac ote P adrão
(D iretrizes M aven)
O bjetivo
1 . s rc /main/java
(Sourc e Folder)
C ontém arquivos c om c ódigo-fonte em linguagem J ava para
c las ses da c amada “C ontroller” da arquitetura M VC, organizados
c om o s eguinte padrão:
[br.]c om.[empres a].[projeto].controller.[js f]
onde
[br.] é um prefixo opc ional, uma vez que o res tante do pac ote
c os tuma s er s uficiente para evitar c olisões de nomes .
[empres a] nome da organizaç ão
[projeto] nome do projeto
[js f| lis tener] s ão originalmente s ubdivididas c om base em
*
dependênc ias de tec nologias típicas da c amada c ontrol ler :
o
js f: P acote que c ontém c lasses com dependência de tecnologia J SF
o
lis tener: Pacote que c ontém classes dependência da tecnologia de
Servlet, especificamente c onhecidas como “listeners”.
A lém dis so, o pac ote raiz pode c onter c lasses alternativas de
s erviço da c amada c ontroller, que não s ejam ac opladas
es pec ialmente a nenhuma das tec nologias ac ima.
2 . s rc /test/java
(Sourc e Folder)
C ontém arquivos c om c ódigo-fonte em linguagem J ava para
c las ses de T este da aplicação, inc luindo tes tes de unidade para
c amada “C ontroller” da arquitetura MVC (c lasses locais do
projeto), e tes tes func ionais da aplicação em geral.
A es trutura interna possui um pac ote “es pelho” ao pac ote
princ ipal, de modo que uma determinada c lasse de tes te
*
A organizaç ão bas eada em dependências de tecnologias visa aumentar a “es tabilidade” de c ada pac ote, mantendo -os c om o mínimo
pos s ível de ac oplamentos (‘imports’). São pos s íveis s ubdivisões em pac otes “func ionais” abaixo do pac ote de tec nologia (ex: por C asos
de U s o), ou mes mo alteração desta ênfase, c olocando -se pacotes “func ionais” antec edendo os pacotes de tec nologia, s e des ejado.
Capítulo A4
c ompartilhe visibilidade de mes mo “package” da c lasse testada.
O bs .: T écnicas de T este de U nidade e Func ional (es ta última
utilizando o produto jCompany Q A ), bem c omo a organizaç ão de
diretórios detalhada, s erão dis cutidos em c apítulo dedicado.
3 . s rc /test/resources
(P s eudo Source- Folder)
C onfigurado c omo Source
folder no E c lipse para melhorar
vis ualização no P ackage
E xplorer, muito embora não
c ontenha c lasses J ava.
C ontém arquivos de rec ursos utilizados em T estes Funcionais,
E s táticos e de C arga/Stress.
4 . s rc /main/config
(Sourc e Folder)
C ontém arquivos c om anotações J ava que representam
“metadados ” do jCompany para a aplic ação, es pecíficos para a
c amada “C ontrole” da arquitetura MVC, organizados c om o
s eguinte padrão:
O bs .: E s tes arquivos também s erão c ompreendidos em c a pítulo
es pec íficos s obre automação de tes tes em geral.
c om.powerlogic.jc ompany.c onfig.[emp|appl*URLs*]
onde
[emp] c ontém arquivo “pac kage -info.java”, que pos sui anotações
em nível da organizaç ão e , portanto, gerais para todos os
projetos . N ormalmente, em ins talações c orporativas, deve s er
utilizado s omente em projetos da c amada Bridge e,
eventualmente, utilizados s omente para s obreposições de
anotaç ões específicas.
[app] c ontém arquivo “pac kage -info.java”, que pos sui anotações
em nível da aplic ação e , portanto, gerais para o projeto c orrente.
[* U RL s*] s ubdiretórios que s erão c riados pelos plugins do
jCompany na medida em que U RL s que repres entem
c olaborações padrões sejam geradas. C ada diretório tem uma
c orres pondência “um para um” c om uma U RL que s iga um padrão
do jCompany, e c onterá um arquivo “pac kage-info.java” c om
“metadados ”. E xemplo:
o
o
c om.powerlogic. jc ompany.config.funcionarioman\
pac kage-info.java: anotações para URL ‘/funcionarioman’
c om.powerlogic. jc ompany.config.funcionariosel\
pac kage-info.java: anotações para URL ‘/funcionariosel’
O bs .: U m maior entendimento sobre “metadados” do jCompany
s erá obtido no des enrolar dos tutoriais, nos próximos c apítulos.
5 . s rc /main/resources
(P s eudo Source- Folder)
C onfigurado c omo Source
folder no E c lipse para melhorar
vis ualização no P ackage
E xplorer, muito embora não
c ontenha c lasses J ava.
Segundo o padrão M aven, es te diretório deve c onter arquivos de
c onfiguração que s erão disponibilizados no “C lass P ath” de
exec utáveis. N a prática, c opiados para o diretório /WE B I N F/classes, em tempo de montagem do arquivo WA R.
6 . s rc /main/webapp
(P s eudo Source- Folder)
C onfigurado c omo Source
folder no E c lipse para melhorar
vis ualização no P ackage
E xplorer, muito embora não
c ontenha c lasses J ava.
C ontém arquivos J ava E E “não J ava”, típicos da c amada
“C ontroller” e “V iew” da arquitetura MVC, podendo ter os
s eguintes formatos:
7 . (raiz) arquivos P O M
o
A rquivos XML de c onfiguração diversos, ta nto para atendimento à
es pecificação Servlet, quando J SF ou Struts e T iles.
o
A rquivos PROPERTIES (texto c ontendo valores no formato
“c have=valor”) de c onfiguração de mensagens e rótulos da
aplicação, para internacionalização (I18n), quanto para
c onfigurações do log4j e jBoss Seam.
o
A rquivos JAVASCRIPT que representam lógicas J avascript/Ajax,
para execução local nas máquinas dos c lientes.
o
A rquivos CSS que representam as peles, que dão aparência (cor,
fontes, etc.) à aplicação.
o
A rquivos de mídia (.GIF, .JPG, .PNG, etc.), utilizados para
dec oração geral da aplicação.
N a raiz do projeto s e enc ontram dois arquivos de c onfiguração
M aven fundamentais para a “c ompilação e c onstrução” de arquivos
WA R, J A R ou E AR:
o
pom.xml: arquivo de c onfiguração de módulo, existente para cada
projeto Eclipse com dependências de c ompilação direta do módulo.
O “pseudo source-folder webapp” merece um maior detalhamento, já que contém diversos diretórios
padrão Java EE e arquivos de configuração padrões:
Entendendo a Arquitetura de Desenvolvimento
Figura A 6.32. Organização do f older “webapp” do projet o principal “rhtutorial”.
Organização Interna do Folder webapp (Ex.: rhtutorial/src/mai n/we ba pp)
P ac ote P adrão
(D iretrizes J ava EE)
O bjetivo
1 . /M E TA -INF
É um folder padrão J ava, que deve c ons tar exatamente c om es te
nome e em maiús c ulas. C ontém os s eguintes arquivos:
o
2 . /res /c ss
*
M ANIFEST.MF: arquivo de configuração padrão J ava para possíveis
dec larações c om relação a um módulo executável (WAR, EAR ou JAR).
N ão é utilizado pelo jCompany, mas incluído s omente para
c onformidade com padrão.
É um folder padrão do jCompany (todos os prefixos e s ufixos ‘plc ’
indic am origem no jCompany) para c onter os s eguintes arquivos:
o
app.geral.css: Arquivo de CSS de arquitetura vazio, específico da
A plicação, devendo s er utilizado para sobreposições de estilos (lookand- feel) corporativos, preferencialmente definidos em arquivos CSS
em nível da empresa (Bridge).
o
app.c omuns.css: Arquivo auxiliar que c ontém a relação de arquivos
C SS necessários para Widgets e Plugins jQ uery em geral, de modo a
evitar que excesso de downloads HTTP. Este arquivo é melhor
explicado no capítulo 22, que fala sobre recursos de RIA.
P ode c onter também arquivos de mídia (.gif,.jpg,.png) que irão variar
em funç ão da “pele” escolhida (arquivos de mídia invariantes devem
fic ar em /plc/midia)
N ota: Aqui pressupomos que o desenvolvedor irá implementar
diversos projetos para uma empresa, reutilizando a mesma “pele”
(C SS) e “layout” (Facelets). Assim, definir estes arquivos inteiramente
em c ada aplicação seria redundância indesejável
3 . /res /midia***
É um folder padrão do jCompany para c onter os s eguintes arquivos:
o
*
A rquivos de mídia (.gif,.jpg,.png) que não variam em função da “pele”
es colhida (arquivos de mídia variantes devem ficar nos diretórios CSS,
tais c omo /plc/css/[pele])
É importante perc eber que o agrupamento de todos es tes recursos abaixo da pas ta “plc ” é propos ital e exc epcionalmente importante
para a performanc e das aplicações, já que todos es tes são recursos passiveis de s erem mantidos em c aching, no c liente (nos
N avegadores). P ara ac ionar es te excepcional rec urso de performanc e, o jCompany já traz pré- c onfigurado o filtro P lcClienteFilter no
web.xml, mapeado para todos os arquivos abaixo de “/plc ”. E s te é mais outro motivo para reforçar o us o des ta c onvenção, e agr upar
rec urs os desta mesma natureza, abaixo deste diretório.
Capítulo A4
E xemplos: logo e rodapés da empresa e imagens de destaque
N ota 1: O jCompany traz algumas imagens utilizadas na página de
login (login-logo-empresa.png). T odas devem s er modificadas (ou
s implesmente s obrepostas).
N ota 2: O logo da empresa, para login, topo e janela sobre, pode s er
mantida na camada “Bridge” para não ficar redundado em cada
projeto, em uma arquitetura mais c orporativa.
4 . /WE B - I NF/
É um folder padrão J ava E E, que deve c o ns tar exatamente c om es te
nome e em maiús c ulas, e deve c onter, em s ua raiz, arquivos de
c onfiguração diversos.
O template I NI padrão traz os s eguintes arquivos pré -configurados:
5 . /WE B - I NF/fcls
o
fac es-config.xml: Arquivo XML de c onfiguração do J ava Server Faces,
que c ontém regras de navegação (inter-URLs) e outras c onfigurações
de c ontrole.
o
beans.xml: Arquivo XML de configuração diversas da aplicação.
o
T rinidad-config.xml: Arquivo XML c om configurações para o Trinidad.
o
web.xml: Arquivo XML de configuração padrão J ava E E, que define
diversos parâmetros globais para a aplicação, de suma importância.
E s te arquivo s erá melhor discutido em tópico à parte.
É um folder padrão M VC, s ugerido para c onter páginas Facelets da
aplic ação que não devem s er ac essadas di retamente (fragmentos
inc ompletos de Facelets, utilizados nos leiautes).
Será princ ipalmente utilizado para c onter páginas de formulários do
negóc io, mas o template I NI traz algumas s ugestões:
6 . (raiz)
o
geralAcoesComplemento.xhtml: Página vazia de arquitetura,
dis ponível para c onter eventual novos botões de ação que aparecem
ao lado dos botões padrões do jCompany
o
geralRodapeComplemento.xhtml: P ágina vazia de arquitetura,
dis ponível para c onter eventual c omplementos à barra de rodapé
aparecendo ao lado das opções genericamente disponíveis no
jCompany.
o
geralMenu.xhtml: Arquivo X HML que define a estrutura de menu
es pecífica da aplicação de modo neutro e que portanto pode s er
renderizado de diversas formas (muitas já automatizadas pelo
jCompany)
C ontém a página Fac elets configurada no web.xml c om “inic ial” da
aplic ação, para a qual o us uário é redirec ionado após c hamar a
aplic ação s em explicitar uma U RL interna es pecífica (E x.:
http://loc alhost:8080/rhtutorial ”).
As classes Java definidas no projeto template padrão têm o seguinte propósito:
Classes Java da A rquitet ura pré-def inidas no projet o principal
C lasse
O bjetivo
1 . /js f/A ppMB
C lasse de arquitetura vazia para c onter possíveis
programaç ões genéricas de c ontrole, para toda
a aplic ação.
2 . /js f/A ppPhaseListener
C lasse de arquitetura vazia para c onter possíveis
programaç ões ativadas em eventos J SF
divers os. A pesar do s ufixo “L istener”, não é um
L is tener padrão Servlet 2 .5.
3 . /lis tener/AppHttpSessionListener
C lasse de arquitetura vazia para c onter possíveis
programaç ões ativadas no momento da c riaç ão
e/ou remoç ão de s essões HTTP no s ervidor
(importante notar que uma s es são é c riada “ao
primeiro c ontato de um novo us uário”, e não
após a s ua autentic ação).
4 . /lis tener/AppServletContextListener
C lasse de arquitetura vazia para c onter possíveis
programaç ões ativadas no momento da
inic ialização e/ou finalização da aplicação pelo
A pplication Server.
6 . /A ppU suarioPerfilService
C lasse de arquitetura vazia para c onter possíveis
programaç ões ativadas no momento “após
autentic ação” de us uários, c onhecidas c omo
Entendendo a Arquitetura de Desenvolvimento
lógic as de “us er profiling” (E x.: regis tros
es pec iais de s egurança em c aching de s essão,
rec uperação de dados de us uários utilizados na
aplic ação tais c omo email, nome c ompleto etc.)
Pela descrição que vimos até aqui, já devemos ter percebido que as classes incluídas nos projetos
gerados não contêm código procedimental em Java. Os poucos artefatos com conteúdo gerados são
alguns arquivos XHTML e mídias de exemplo para permitirem uma apresentação inicial de Web-Design
para a aplicação, a ser modificada para o contexto de cada empresa/aplicação.
Os verdadeiros propósitos do plugin de criação de projetos, e de outros que compõem o jCompany
Artifact Generator, são reforçar:
o
Gerência de Configuração: Pré-configuração da grande diversidade de frameworks, tecnologia
Java EE e bibliotecas utilizados, em uma linha de base íntegra e homologada no jCompany.
o
Padrões de Arquitetura: Pré-definição de locais apropriados para implementações específicas
(CSS, Javascript, botões de ação complementares, rodapé etc.), o que faz parte do trabalho de
definição de uma arquitetura extensível. Não fosse assim, ficar-se-ia ao sabor de preferências
momentâneas do implementador, o que dificultaria sobremaneira as manutenções e economia
de escala.
As classes Java presentes nos templates INI, portanto, estão vazias, visando apenas promover o uso de
padrões de programação da arquitetura.
Nota: Além disso, estas classes não são instanciadas pelo desenvolvedor, mas por algum esquema de
“Inversão de Controle” (IoC). O jCompany faz IoC através do padrão CDI (jCompany 6.x) ou via jBoss
Seam complementado por técnicas próprias (em versões 5.5.x ou inferiores). Além disso, reutiliza IoC
clássico para APIs como Listener e Filter, utilizando o web.xml para declarar estas implementações (até
que o uso de conteiners no padrão Java EE 6 se popularizem, de modo a possibilitar o uso de anotações).
Os diversos mecanismos de IoC utilizados ou implementados pelo jCompany serão discutidos em
detalhe nos capítulos de programação de regras de negócio , no módulo E.
- O projeto “model” (Serviços de Negócio e Persistência)
O projeto “model” contém pacotes para programações da camada Model do MVC2-P, incluindo
segmentação por pacotes de classes de implementações de Fachada (DP Faça de) e de classes da camada
de Persistence (assim como o projeto principal “rhtutorial” segmenta internamente as camadas Controller
e View ).
Do ponto de vista da “Visão Interna”, é a seguinte a organização padrão do projeto “rhtutorial_model”,
conforme definida no template INI:
Figura A 6.33. Organização interna do projet o model ”rhtutorial_model”.
Organização Interna do Projet o Model (Ex.: rhtutorial_model)
P ac ote P adrão
O bjetivo
1 . s rc /main/java
(Sourc e Folder)
C ontém arquivos c om c ódigo-fonte em linguagem J ava para c lasses
da c amada “M odel” da arquitetura MVC, organizados c om o s eguinte
padrão:
[br.]c om.[empres a].[projeto].modelo.[facade| model|persistence]
onde
[br.] é um prefixo opc ional, uma vez que o res tante do pac ote
c os tuma s er s uficiente para evitar c olisões de nomes .
Capítulo A4
[empres a] nome da organizaç ão
[projeto] nome do projeto
[fac ade| model|persistence] s ão originalmente s ubdivididos c om base
em s ubc amadas dentro do projeto:
2 . s rc /main/config
(Sourc e Folder)
o
fac ade: Pacote que encapsula classes de I mplementação dos
C ontratos de Fachada (DP Façade). As interfaces ficam no projeto
“c ommons”.
o
model: Pacote que encapsula classes de s erviço (Casos de Uso) da
aplicação.
o
pers istence: P acote que contém c lasses que acessam repositórios de
dados, tipicamente SGBD-Rs. Subdivide-se, em c onformidade c om a
tec nologia de implementação em “jpa”.
C ontém arquivos c om anotações J ava que representam “metadados”
do jCompany para a aplic ação, es pecificas para a c amada “M odel”
da arquitetura M VC, organizados c om o s eguinte padrão:
c om.powerlogic. jc ompany.config.[model| persistence].[app|xxx]
onde
[model| persistence] s egmenta metadados de c amada uma das
res pec tivas c amadas:
o
model: contém arquivo “package-info.java”, c om anotações de
c onfiguração para a c amada model.
o
pers istence: c ontém arquivo “package-info.java”, reunindo anotações
de c onfiguração para a c amada persistence.
[app| xxx] é uma s igla de três letras (app é padrão), que define um
módulo, des te modo diferenc iando anotações da c amada modelo
para o módulo princ ipal (app) e outros pos síveis (“pes” para módulo
P es soa etc .).
3 . s rc /main/resources
(P s eudo Source Folder)
C onfigurado c omo Source
folder no E c lipse para
melhorar vis ualização no
P ac kage E xplorer, muito
embora não c ontenha
c las ses J ava.
C ontém diretório padrão M ETA-INF para J ARs, nes te c aso c om
c onfigurações (opcionais) para E J Bs.
4 . s rc /test/java
(Sourc e Folder)
C ontém arquivos c om c ódigo-fonte em linguagem J ava para c lasses
de T es te do módulo, inc luindo testes de unidade para c amada
“M odel” da arquitetura M VC (c lasses loc ais do projeto).
A es trutura interna possui um pac ote “es pelho” ao pac ote principal
do módulo, de modo que uma determinada c lasse de tes te
c ompartilhe de visibilidade de mes mo “pac kage” da c lasse testada.
5 . (raiz) pom.xml
N a raiz do módulo s e enc ontra o arquivo M aven de c onfiguração para
“c ompilação e c onstrução” do arquivo J AR c orrespondente:
pom.xml: arquivo de c onfiguração de módulo, existente para c ada
projeto E c lipse, e c ontendo as dependências de c ompilação direta do
módulo.
As classes Java definidas no template INI para projetos “model” têm o seguinte propósito:
Classes Java da A rquitet ura pré-def inidas no projet o “model”
C lasse
O bjetivo
1 . /fac ade/AppFacadeImpl
C lasse de arquitetura vazia para c onter possíveis
es pec ializações de implementação ao c ontrato de
“M anutenç ão de C iclo de V ida e M anipulação de
A gregações”, mantido pelo jCompany.
- O projeto “commons” (Entidades e Contratos)
O projeto “commons” contém pacotes para programações das Entidades de Domínio e
Interfaces de Fachada (DP Façade), que definem contratos entre aplicações (Controller) e serviços
(Model). Além disso, pode conter classes de utilitários comuns que sejam necessárias em todas as
camadas MVC-P, deste modo evitando-se redundá-las.
Na “Visão de Módulos” veremos que as Entidades devem ser expostas a todas as camadas MVC -P mas
não podem depender de nenhuma delas. Deste modo, passam a configurar uma camada ortogonal e se
tornam a parte mais estável da arquitetura.
Entendendo a Arquitetura de Desenvolvimento
Por hora, vamos nos concentrar no entendimento da arquitetura interna deste projeto, conforme definido
no template INI:
Figura A 6.34 Organização interna do projet o modelo ”rhtutorial_commons”.
Organização Interna do Projet o Commons (Ex.: rhtutorial_commons)
P ac ote P adrão
O bjetivo
1 . s rc /main/java
(Sourc e Folder)
C ontém arquivos c om c ódigo-fonte em linguagem J ava para c lasses da
c amada “D omínio e C ontratos”, ortogonal a todas as c amadas da
arquitetura M VC e que c ontém artefatos c omuns a todas elas. O s
arquivos s ão organizados c om o s eguinte padrão:
[br.]c om.[empres a].[projeto].[entity |facade|commons]
onde
[br.] é um prefixo opc ional, uma vez que o res tante do pac ote c ostuma
s er s ufic iente para evitar c olisões de nomes .
[empres a] nome da organizaç ão
[projeto] nome do projeto
[entity | fac ade| c ommons] s egmentas os s eguintes tipos de c lasses:
2 . s rc /main/config
o
entity: Pacote que encapsula classes que representam conceitos de
negócio, chamadas “E ntidades de D omínio”
o
fac ade: Pacote que encapsula interfaces que definem o contrato de
fac hada (DP Façade). As classes de implementação ficam no projeto
“M odel”.
o
c ommons: Pacote que pode encapsular classes utilitárias de uso c omum
em todas as camadas MVC-P, para a aplicação (utilitários de interesse
inter-aplicações devem s er disponibilizados em módulo à parte).
C ontém arquivos c om anotações J ava que representam “metadados” do
jCompany para a aplic ação, es pecificas para a c amada “C ommons” da
arquitetura M VC, organizados c om o s eguinte padrão:
c om.powerlogic.jc ompany.c onfig.[domain|commons].[app| emp]
onde
[domain| c ommons] s egmenta metadados de c amada uma das
res pec tivas c amadas:
o
domain: contém arquivo “package-info.java”, c om anotações de
c onfiguração de domínio para a c amada commons.
o
pers istence: c ontém arquivo “package-info.java”, reunindo anotações de
c onfiguração para a c amada Persistence.
[app| xxx] é uma s igla de três letras (app é padrão), que define um
módulo, des te modo diferenc iando anotações da c amada model para o
módulo princ ipal (app) e outros pos síveis (“pes ” para módulo P essoa
etc .).
3 . s rc /main/resources
(P s eudo Source Folder)
C onfigurado c omo
Sourc e folder no E c lipse
para melhorar
C ontém diretório padrão M ETA-INF para J ARs, nes te c aso c om
c onfigurações de P ersistence J PA (pers istence.xml), e também o arquiv o
hibernate.c fg.xml.
E s tas declarações de P ersistence s ão idealmente mantidas no mes mo
Capítulo A4
vis ualização no P ackage
E xplorer, muito embora
não c ontenha c lasses
Java.
projeto das E ntidades, para maior c oesão, e não implic am em
dependênc ias ou ac oplamentos por s erem apenas c onfigurações
(metadados ).
4 . s rc /test/java
(Sourc e Folder)
C ontém arquivos c om c ódigo-fonte em linguagem J ava para c lasses de
T es te do módulo, c onsistindo de testes de unidade para c amada
“E ntidades, C ontratos e U tilitários C omuns” da arquitetura MVC (c lasses
pres entes locais do projeto).
A es trutura interna possui um pac ote “es pelho” ao pac ote principal do
módulo, de modo que uma determinada c lasse de tes te c ompartilhe de
vis ibilidade de mes mo “pac kage” da c lasse testada.
5 . (raiz) pom.xml
N a raiz do módulo s e enc ontra o arquivo M aven de c onfiguração para
“c ompilação e c onstrução” do arquivo J AR c orrespondente:
o
pom.xml: arquivo de c onfiguração de módulo, existente para cada projeto
E c lipse, e c ontendo as dependências de compilação direta do módulo.
As classes Java definidas no projeto template default para “commons” têm o seguinte propósito:
Classes Java da A rquitet ura pré-def inidas no projet o “commons”
C lasse
O bjetivo
1 . /c ommons /AppBaseContextVO
C lasse de arquitetura vazia para c onter possíveis
es pec ializações de valores de c ontexto da
aplic ação que prec isem s er transportados para a
c amada M odel (D P C ontext).
2 . / c ommons /A ppConstants
C lasse de arquitetura vazia para c onter possíveis
c ons tantes que tenham es copo c omum e m
várias c amadas MVC.
3 . / c ommons /A ppException
C lasse de arquitetura vazia para c onter possíveis
es pec ializações de P lcException, que é a exc eção
“mes tra” que enc aps ula (“wrapper”), exc eç ões
es pec íficas do negócio ou ines peradas.
4 . / c ommons /A ppUserProfileVO
C lasse de arquitetura vazia para c onter possíveis
atributos ac erca do perfil do us uário c orrente
(dados mantido em s es são pelo jCompany),
des te modo enc apsulando dados relacionados ao
us uário (c riado através do s erviço
A ppU suarioPerfilService).
N ota: E s tá no c ommons, obviamente, porque é
trans portada para c amada M odel, nos c ontratos
padrões do jCompany, para que lógic as de
negóc io “c onheçam” es tes dados.
5 . /entity/AppBaseEntity
C lasse de arquitetura vazia para c onter possíveis
anotaç ões de P ersistence c omuns a todas as
“E ntidades” no es c opo da aplicação. E la, por s ua
vez, herda propriedades c omuns de auditoria
“pauta mínima” (us uário e data/hora da última
alteraç ão), e vers ão (tratamento de c oncorrência
otimis ta), s ugeridas pela metodologia.
E ntidades devem herdar des ta c lasse, s e
des ejarem reus ar as definições ac ima.
6 . /fac ade/IAppFacade
I nterfac e de arquitetura vazia para c onter
pos s íveis cláusulas de es pecializações do
c ontrato de “M anutenção do C iclo de V i da e
M anipulação de A gregações” do jCompany.
N ota: N ão deve s er utilizada para definição de
c ontratos de negóc io es pecíficos que não tenham
relaç ão c om o c ontrato “mantido” pelo
jCompany. P ara tanto, deve- se c riar PO JI (P lan
O ld J ava I nterfaces) independe ntes.
U m aprendizado detalhado s obre elaboração de
c ontratos Façade do negóc io s erá obtido em
c apítulos s obre “P rogramação de Regras de
N egóc io no jCompany”.
Entendendo a Arquitetura de Desenvolvimento
Sumário
Neste capítulo, fizemos uma breve revisão sobre preceitos da Arquitetura de Software e discutimos a
“Visão Interna” e “Visão de Módulos” da arquitetura incorporada e proposta pelo jCompany, tomando
como base os três projetos gerados no capítulo anterior.
Ao expormos os critérios (“Rationale”) utilizados pela Po werlogic para absorção e concepção da
arquitetura sugerida, provemos as condições necessárias para ajustes específicos e especializações
corporativas que se façam necessários.
No próximo capítulo iremos sair da Arquitetura de Software para ingressar na Metodologia de Construção
Java EE incorporada no jCompany, começando por entender seus Casos de Uso Padrão e a aplicação
que iremos desenvolver mais em detalhes.
O retorno a este capítulo, após uma maior experimentação prática no jCompany, é altamente
recomendável.
Download