Entendendo a Arquitetura
de Desenvolvimento
6
A
Introduo
- Reso de Arquitetura de Software
jCompany Developer Suite pode ser compreendido como uma soluo de reso em nvel
No h muita controvrsia sobre a importncia decisiva que uma boa Arquitetura de Software pode ter
em processo de desenvolvimento de software em geral. Tambm h um grande reconhecimento, por
parte de especialistas, com relao ao papel central que os frameworks assumem nesta questo. Porm,
muitas empresas no chegam a experimentar os resultados prometidos nesta rea.
Para no corrermos este risco e obtermos os melhores resultados, nossa proposta somar o reso de
uma arquitetura abrangente com padres de alto nvel e automao de atividades, orquestradas por
Cheat-Sheets do Eclipse.
Nossa arquitetura tambm ser ajustada para a eficincia de processamento, um outro ponto comumente
negligenciado. um erro imaginar a arquitetura apenas do ponto de vista estrutural e terico. A
arquitetura influi decisivamente em performance e devem ser considerados os comportamentos dinmico
e prtico da aplicao, alm dos fatores usabilidade, flexibilidade e outras dimenses concorrentes, em
nossa problemtica.
No se satisfaa com uma Arquitetura de Software rasa. Mesmo uma arquitetura incipiente poder
produzir um bocado de documentos e diagramas impressionantes, mas trar resultados medocres,
quando algum. Uma arquitetura para o perfil tpico de projetos corporativos, por exemplo, deve
definir, em detalhes, dependncias entre projetos e mdulos, pacotes dentro de projetos,
artefatos, eventos de programao de alto nvel e, finalmente, trazer um bom nmero de
generalizaes e padres que conduzam a um resultado visvel para o negcio, rapidamente.
Nos prximos tpicos, discutiremos nveis de maturidade de arquiteturas de software.
Neste estgio, as lacunas esto vazias entre a plataforma de infra-estrutura Java EE (1) e as aplicaes
de negcio (5). Por este motivo, um enorme potencial para erros est espreita dos desenvolvedores,
que ficam s voltas com programaes repetitivas de cdigo, que deveriam estar fatoradas em
nvel arquitetural.
No h como evitar. Para uma arquitetura real, ser necessrio que os arquitetos passem do
domnio dos conceitos para a experincia de uso nas tecnologias, suas possveis combinaes,
deficincias e valores, alm de provveis variaes de uso.
Montar uma arquitetura madura demanda um tempo que no pode ser facilmente abreviado
especialmente uma que envolva altssimas taxas de reso, partindo de solues best-of-breed Java EE
Open Source. Nesta filosifia, que a adotada pelo jCompany, a recomendao escolher peas
melhores em seu segmento. Algumas dezenas de tecnologias, projetos e componentes OSS devero ser
entendidos, selecionados, especializados e integrados, muitos deles em reas de conhecimento com
razovel distino das demais.
Por exemplo, a camada Viso do MVC envolve a orquestrao de diversas tecnologias complexas, tais
como JSP/Facelets (XHTML)/HTML, Javascript, CSS, Ajax, tcnicas de gesto de leiautes, etc.,
nenhuma delas de domnio especfico do mundo Java ou OO, de domnio dos Arquitetos de
Software. O resultado, na prtica, uma quase ausncia de arquitetura para a camada Viso,
delegada para tratamento superficial pelos Web-Designers.
Refinar uma boa arquitetura para a camada Controle tambm tem seus desafios, j que esta bem
mais complexa, tecnologicamente, do que as camadas subsequentes de Modelo/Domnio ou Persistncia.
uma outra camada onde o nvel de solues de arquitetura costuma ser muito raso, basicamente
consistindo de homologao de algum framework de base "em seu estgio bruto".
As camadas de Modelo, Domnio e Persistncia, por serem mais puramente ligadas a linguagem Java
e s regras de negcio costumam receber 90% da ateno nos trabalhos tpicos de Arquitetura de
Software, ao menos em seu estgio inicial. Porm, ao longo do tempo se far necessrio um esforo
nas demais camadas, que exigiro um considervel aprofundamento tecnolgico.
Etc.
H um avano perceptvel com relao arquitetura meramente conceitual do incio, mas neste nvel a
arquitetura ainda rasa ao ponto de no eliminar mesmo variabilidades bsicas indesejveis.
A distncia entre a realidade e a promessa de retorno de ambientes Orientados a Objeto continua imensa
- por isto batizamos a este estgio de Arquitetura de Software Anmica.
um estgio basicamente caracterizado por uma integrao pouco profunda e abrangente entre um
nmero tambm insuficiente de produtos Open Source de base, conforme ilustra a Figura A6.2. Note que
as camadas sob responsabilidade da empresa so representadas na mesma colorao da camada de core
business.
Mas para ser de nvel intermedirio, realisticamente, esta arquitetura ir requerer uma comprovao de
uso satisfatrio em produo seguido das inevitveis refatoraes - por pelo menos dois anos. um
perodo mnimo, aps a construo da primeira verso, durante o qual uma equipe de perfil abrangente*
conseguir evoluir para este nvel de maturidade.
* Composta de Arquiteto de Software, Analistas de Negcio, Web-Designers, Peritos nas Tecnologias, Documentadores, Analistas de
Teste etc.
A partir deste ponto, no entanto, este modelo comea a apresentar suas limitaes, especialmente se a
implementao 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 negcio, j que grande parte da soluo arquitetural no diferencial
para seu negcio.
Aumento de Custo: Mesmo que haja uma contratao de terceiros para a manuteno desta
camada, perdem-se os ganhos de escala possveis a partir do reso da parcela commodity da
arquitetura.
A percepo mais comum de que h uma dificuldade de ordem prtica para que esta soluo familiar
evolua para o prximo passo. Na medida em que as presses de negcio sobre aplicaes implantadas
prevalecem como prioridade, como haver de ser, h uma tendncia estagnao ou lentido para a
incorporao de inovaes, medo de reformulaes, etc.
Figura A6.5. Arquitetura em camadas de uma aplicao Java EE com o jCompany Full Stack Framework.
(4) Soluo de base para a criao da camada especfica da empresa, chamada camada
Bridge. Deste modo, arquitetos da empresa podem imediatamente codificar suas generalidades e
especializaes de ltima milha, sobrepondo ou especializando artefatos da camada (c). Este
um espao concreto que possibilita a criatividade, customizao e generalizao que dependem
do contexto da empresa (segurana, web-design etc.)
So o que Rod Johson, o criador do Spring, chama de Own Career Driven Architects [Johnson, Rod 2004] - indivduos que no
compreendem a importncia, para sua empresa, de orientarem a sua criatividadde para camadas de negcio. a insistncia em no
reusar, pelo desafio (ou interesse) pessoal de fazer.
Reviso de Fundamentos
- Como Representaremos a Arquitetura?
Um sistema de software corporativo composto de muitas estruturas distintas, com relacionamentos
complexos. Portanto, so necessrias diversas vises para representar cada uma delas [TS-4619
JavaOne 2006]. Neste livro, iremos discutir as seguintes vises arquiteturais:
o
Viso Geral (General View): Utilizaremos a Viso Geral para uma primeira representao
(macro) das grandes camadas (Layers) e Blocos (Tiers) da arquitetura.
Viso de Mdulos (Module View): Utilizaremos a Viso de Mdulos para representar como
esto agrupados os conjuntos de artefatos em tempo de desenvolvimento e como eles se
relacionam entre si, em vrios nveis de detalhamento.
Viso Interna (Internal View): Utilizaremos a Viso Interna para representar como esto
organizados os projetos de desenvolvimento do ponto de vista de sua estruturao interna. um
tipo de viso de micro-arquitetura, considerando organizao dos pacotes e artefatos padres
definidos.
Viso da Interface com o Usurio (GUI View): Utilizaremos a Viso de Interface com o
Usurio para representar os padres de leiautes, formulrios e componentes disponveis, como
esto organizados e interao entre si. Ela no contempla questes de usabilidade, discutidas
fora do mbito da arquitetura.
Alm das representaes principais para as vises acima, o detalhamento da arquitetura requer
documentos mais extensos que, por motivos didticos, no so disponibilizados neste livro. Eles esto
disponveis na documentao do mdulo jCompany Patterns & Methods, cedido com a licena
corporativa do jCompany.
Neste captulo, apresentaremos as trs primeiras vises: "Geral", "de Mdulos" e Interna. Com a
exceo da "Viso de Execuo", que somente ser abordada no Volume II desta srie, as demais sero
discutidas em captulos subsequentes.
Uso burocrtico, concebido para lidar com problemas intrnsecos do EJB 2.x, sem considerar
evolues tecnolgicas tais como o Java EE 5 e 6 e EJB 3.0 e 3.1;
Iremos discutir conceitos nestas trs reas, a comear pela questo das camadas:
o
Nas Figura A6.11 e Figura A6.12 vemos duas combinaes em camadas reais que produzem
arquiteturas estveis, corretamente diagramadas, e inclusive muito comuns em software.
Mesmo em uma arquitetura mais elaborada, como no caso da Figura A6.12, importante percebermos
que o raciocnio fundamental de minimizar dependncias atravs do uso de camadas continua presente.
Mas quais so os critrios para definirmos nossas camadas? O que cada camada ir conter e como
dependero umas das outras? Bom, estas respostas sero obtidas a partir de um raciocnio OO que
dever seguir inicialmente os velhos princpios de baixo acoplamento e alta coeso.
Na implementao, classes que possuem menos dependncias tendem a ser mais simples de se
compreender e mais estveis, menos sensveis a turbulncias externas. Classes de camada Controle,
por exemplo, tendem a possuir mais dependncias, tais como interfaces de Servlet e de frameworks
como JSF ou Struts. Tendem, portanto, a ter mais imports que classes da camada Modelo ou
Domnio e a serem mais instveis (Por isso, dentre outros motivos, no so boas candidatas para
conterem implementaes importantes do negcio).
Mas como ser que isso se manifesta realmente, na prtica? Vamos ilustrar com o pequeno episdio real.
Certa vez, uma contribuio a um release menor do Tomcat 5.x introduziu a exigncia de
declarao implements Serializable para todos os objetos que fossem mantidos em sesso (a
inteno da equipe do Tomcat era atender a um aprimoramento de suporte a Clusters).
As nicas classes que realizavam registro em sesso eram, naturalmente, as que possuam acesso
(dependncia) a interfaces de Servlet. Apesar de ser uma mudana trivial nos objetos (uma
simples declarao), em vrias situaes de migrao para Tomcat 5.x, em todo o mundo, algumas
classes de controle escapavam reviso e cancelavam em produo, manifestando a
instabilidade provocada por esta dependncia.
um tpico problema produzido em camadas mais baixas da arquitetura que no acontece nas superiores
(de negcio, por exemplo), graas organizao em camadas do MVC.
Mais recentemente, a fatorao de cdigo deu lugar a uma sucessora: a refatorao de cdigo
(Refactoring).
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 mudana de nfase para a
refatorao faz sentido na medida em que admitimos a dificuldade de se produzir cdigos bem fatorados,
de sada.
A verdade que hoje conhecemos que, ao contrrio do que alguns metodologistas eminentemente
tericos apregoam, dificilmente se obtm uma boa arquitetura na sua primeira verso.
Especialistas nas tecnologias e processos de Especificao (CASE UML, Ferramentas MDA etc.), mas que
pouco ou nada conhecem das tecnologias e processos de Construo, tero ainda mais dificuldade neste
objetivo. Portanto, ser prudente partir de preceitos arquiteturais que visem facilitar a refatorao ou
reformulao de cdigos de uma forma geral, com a produo do mnimo de instabilidade possvel.
Uma boa arquitetura obtida de exploraes prticas seguidas de refatoraes frequentes,
oportunidades que somente so bem aproveitadas por arquitetos de software hands-on, que se
atrevem a por a mo na massa.
Mas, mesmo sendo macro, esta representao muito simplria para estudos arquiteturais. Isto porque
nem a camada 3, do jCompany (Arquitetura Reutilizada), nem a camada 4, Bridge (Arquitetura
Especfica), funcionam como Layer, todo o tempo, como o diagrama pode sugerir.
Exceto nos percentuais de requisitos onde os Casos de Uso Padres so suficientes, o desenvolvedor
poder (e isto ser desejvel) acessar a camada 2 (JBoss Seam, Tiles/Facelets, JPA/Hibernate, etc.)
diretamente ou, mais raramente, a camada 1, em nvel do Application Server ou JVM.
Portanto, o diagrama abaixo mais realstico tecnicamente falando do que o anterior.
#1. Nas parcelas de requisitos de Casos de Uso centrados em dados, tanto o jCompany FS
Framework quanto a complementao Bridge praticamente isolam a aplicao das camadas
de baixo, atuando como camadas (Layers). importante notar as setas tracejadas de
dependncia, indicando que estas "camadas" comunicam entre si para oferecer um resultado
MVC completamente generalizado.
#2. Em requisitos que fogem ou suplementam os suportados pelos padres, o acesso pode ser
direto camada de frameworks de base. Deste modo, a arquitetura no restringe; possibilita
ao desenvolvedor elaborar quaisquer solues que sejam convenientes, para cada caso.
Em quanto por cento dos casos o jCompany FS Framework e a Bridge funcionaro como camadas? Bom,
isso depende da natureza dos requisitos de cada projeto. Em um estudo de ROI (Retorno sobre o
Investimento) elaborado pela Powerlogic, a torta apresentada na Figura A6.15 tomada como base,
para um projeto corporativo tpico.
Assim, em 40% dos casos, em mdia, espera-se que o jCompany FS Framework atue como uma
camada, evitando contato direto de cdigos de negcio com frameworks de base.
Nos demais segmentos de requisitos, o framework ir contribuir provendo servios de IoC, DI, AOP para
gerncia de transaes, leiautes etc.; todos bastante teis, mas que no visam isolamento. Deste
modo mantm-se a liberdade para que o desenvolvedor acesse qualquer recurso de base, quando
necessrio for.
Veja a contribuio esperada (tambm em mdia, claro) para cada fatia de natureza de requisitos,
acima definida, na Figura A6.16.
Quando funciona como camada, o nvel de contribuio do framework do jCompany no estudo foi
impressionante. Mas mesmo considerando-se o percentual de contribuio nas outras fatias,
devidamente ponderados, obtm-se ganhos expressivos!
2.
Uso de camada de persistncia, subdivindo a de modelo, atravs do DP DAO (ao que chamamos,
resumidamente, de MVC2-P)
3.
4.
5.
Arquitetura rica, tambm para a camada Viso, com exclusivo IoC Universal, inclusive para esta
camada.
Primariamente, o jCompany resa o modelo MVC-2 clssico com separao rigorosa das suas
camadas utilizando o servlet de Front-Controller do JSF ou Struts (FacesServlet ou ActionServlet).
O uso deste DP Front-Controller o que distingue o MVC-2 do MVC-1, j que no segundo caso o
usurio acessa as JSPs diretamente.
2.
Em segundo lugar, o jCompany define uma nova camada para servios de persistncia,
subdiviso da camada Modelo, provendo contratos abstratos (Interface e DP Abstract
Factory), alm de implementaes concretas genricas e alternativas para Hibernate ou
JPA. A camada de Persistncia no uma sub-diviso clssica do MVC, mas como um layer
verdadeiro e muito comum no mercado, iremos enfatiz-lo com a sigla MVC2-P.
3.
4.
Em quarto lugar, o jCompany refina a arquitetura para dentro de cada camada MVC2-P,
definindo uma organizao refinada de pacotes e novas categorias de classes internas tais como
Service e Helper, utilizadas com DP Composite [Freeman, Freeman 2004] para maximizar a coeso
e minimizar ainda mais o acoplamento.
5.
Como vimos, esta uma camada especialmente mal resolvida em arquiteturas tpicas 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
reutilizveis e controlados pelo framework (leiautes dinmicos com Tiles/Facelets), componentes visuais
especializados, solues para reso e especializao de peles, rotinas Javascript/Ajax etc., tudo isso com
DPs e conceitos OO aplicados, como nas demais camadas. Este assunto ser discutido de forma
especfica em captulo sobre customizao de Web-Design.
Figura A6.17. Arquitetura MVC preconizada no J2EE clssico (at EJB 2.1).
#1. Usurio aciona aplicao: No modelo MVC-2, um servlet recepciona todas as requisies do
usurio (e no os componentes de viso tais como JSP ou JSF, como no MVC-1)
#2. Camada controle chama servios de negcio: Um aparato de Design Patterns tais como
Business Delegate, Session Faade e outros so tipicamente utilizados para um maior
isolamento entre a camada da aplicao (Controle e Viso) e a camada de negcio (Modelo), e
tambm devido a uma pressuposio de remoting, ou seja, da potencial distribuio destas
camadas por mquinas distintas, em runtime. Classes remotas so, principalmente EJB Session
Beans 2.x.
#3. Todas as principais camadas compartilham utilitrios. Muito embora no sejam
representados com frequncia, componentes JAR contendo bibliotecas suplementares para
operaes com data, logging, numricas, tratamento de excees etc., so dispostas de forma
a estarem disponvel em todas as camadas.
#4. Uso de Entity Beans 2.x: A persistncia ideal do ponto de vista da especificao obtida
atravs 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 limitaes tecnolgicas ou de performance, requerendo codificao de
SQL diretamente nos cdigos Java.
#6. Acesso a servios de persistncia: Seja por responsabilidade do container EJB, no caso dos
Entity Beans ou do desenvolvedor nos DAOs, somente atravs de classes desta camada o
repositrio de armazenamento (Ex.: SGBD-R) acessado.
#7. Criao do meio de transporte: Aps a recuperao de informaes persistidas, seja por
que meio forem, a codificao da cpia dos dados de Entity Beans ou JDBC Result Sets para
DTOs (Data Transfer Objects) obrigatria.
#8. Controle de fluxo de navegao: No modelo MVC-2, as classes de Controle decidem para
que classes de visualizao iro delegar a finalizao da resposta ao usurio. Uma nova verso
de Interface com o Usurio ento selecionada em funo do estado atual da conversao.
#9. Despacho da visualizao: Classes representando tecnologias da camada Viso tais como
JSP, JSTL, Tiles, facelets ou JSF despacham algum formato de visualizao para dispositivos
de cliente, tais como HTML, XML, PDF, CSV, etc.
Perceba que, como a estrutura de dados dos formulrios de negcio composta em sua maior parte por
propriedades das entidades do negcio, a estrutura das classes de DTO terminava por ser 90% a 100%
redundante com a estrutura das classes Entity Bean. Por consequncia, a manuteno desta redundncia
exigia cdigos burros de transferncia de dados (de->para), instanciaes de classes desnecessrias
etc.
Os outros graves problemas desta especificao Entity Bean (at a verso 2.x), tais como srias
restries da linguagem de persistncia EJB-QL, limitao ao uso de herana etc., findavam por
configurar um verdadeiro desastre em termos de produtividade - e Orientao a Objetos.
Na prtica, muitos resolviam este problema simplesmente desistindo dos Entity Beans 2.x (de fato, quase
inutilizveis). Mas quem no os substitua por algum framework de mapeamento Objeto-Relacional tal
como o Hibernate, passava a programar JDBC em EJB Session Beans, como exemplificado em (E), com
manipulao direta de result sets e cpias de/para DTOs (ou VOs), caindo em nveis de produtividade
de tcnicas de programao da gerao COBOL. Na verdade, em nveis piores devido s deficincias
intrusivas da gerao EJB 2.x, como visto.
Felizmente, os Entity Beans 2.x so agora legado, substitudos na verso EJB 3.0 por POJOs (Plain Old
Java Objects) que corrigem, da gua para o vinho, todas as limitaes clssicas.
Uma sequela disso que os Entity Beans 3.0 foram inteiramente reconcebidos a partir do padro Java EE
5 e o ramo 2.x no sofrer mais evolues. Ruim para quem acreditou cegamente neste tipo de padro
forado 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 padro de-facto, como o Hibernate/JPA*.
Padres de facto do mercado Open Source, via de regra, superam os de comit. Somente nos
ltimos anos, os condutores estratgicos do Java EE 5 e Java EE 6, especialmente a SUN, focou
nos anseios dos desenvolvedores e no somente dos fabricantes de Application Server. Esta
tendncia tem levado quase eliminao de padres artificais concebidos sem explorao tcnica.
O criador da Hibernate, Gavin King, foi um dos lderes da especificao EJB3, especialmente da parte de Entity Beans, que foi
redefinida dentro do padro JPA (Java Persistance Architecture). Por isso, o JPA hoje 90% similar arquiteturalmente ao que j se
usava na Hibernate.
#1. Camada comuns engloba utilitrios e DTOs eventuais: As classes utilitrias comuns a
todas as camadas MVC principais, bem como eventuais DTOs que ainda sejam necessrios so
encapsulados na viso Comuns.
#2. Camada de persistncia mais leve, utilizando JPA-QL: A camada de persistncia agora
pode dispensar codificao de incluses, alteraes, excluses e de tratamentos de
concorrncia, gerao de identificadores automticos, dentre outros trabalhos realizados de
forma transparente pelo JPA. Alm disso, a linguagem JPA-QL retorna grafos de entidades de
domnio prontamente disponveis para uso pelas demais camadas de forma OO, e no mais
result sets JDBC, relacionais.
#3. Camada ortogonal para Entidades de Domnio: A camada de domnio agora representa
um objeto clssico de OO, com propriedades e responsabilidades (mtodos) do negcio, alm
de poderem ser utilizadas em qualquer camada MVC2-P. importante notar que agora as
nobres classes desta camada so as mais estveis da arquitetura, no dependendo de servios
de nenhuma outra, nem de persistncia, por exemplo (a camada de Persistncia recupera
dados e disponibiliza para a de Domnio).
Na camada simplificada como Comuns (1) esto includas classes de utilitrios 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 tambm algumas dependncias especificas de cada
camada, ao centro (Mat. Prima OSS, Service, Helper):
Neste livro, utilizaremos MVC2-P quando quisermos enfatizar uma arquitetura MVC do tipo 2, com subcamada de Persistncia bem
definida.
Figura A6.19. Arquitetura MVC2-P com dependncias ortogonais globais e internas das camadas.
#1. DP Faade: Apesar de representarmos, didaticamente, uma seta com dependncia entre
Controle e Modelo (do Controle para a subcamada de implementao de Fachada), o DP Faade
utilizado nesta interao, de modo que h um acomplamento leve, facilitando
reimplementaes de servios, se/quando necessrio.
#2. Transporte DTO e Context: Quando um Caso de Uso apresenta formulrio com estrutura
bastante distinta das Entidades, pode-se lanar como recurso de transporte os tradicionais
DTOs (Data Transfer Objects), como exceo, no mais como regra! Alm disso, um POJO com
DP Context Object utilizado pelo jCompany para transportar, genericamente, informaes de
contexto da camada Controle para Modelo, que podem ser teis (perfil do usurio autenticado,
metadados de colaborao etc.).
#3. Utilitrios Globais: Classes do jCompany com sufixo Helper trazem funes diversas,
complementares a funes de utilitrios de mercado, de interesse de todas as camadas.
#4. Matria-Prima OSS Global: Representam dependncias externas (JAR) de utilitrios,
tambm comuns a todas as camadas MVC2-P, tais como Log4j, Commons, CGLib (AOP) etc.
#5. Servios e utilitrios Especficos: Dentro de cada grande camada MVC2-P, h subdivises
de pacotes segmentando e encapsulando servios e utilitrios internos do jCompany,
especficos para a camada.
#6. Matria-Prima OSS Especfica: Cada camada MVC2-P possui um conjunto agrupado de
dependncias externas de interesse seu apenas (definido tanto no Maven quanto em User
Libraries do Eclipse). Este agrupamento simplifica a gesto de dependncias, evitando falhas
bsicas de arquitetura produzida por desenvolvedores. Ex.: Importaes de servios de
persistncia na camada Controle.
importante observarmos algumas dependncias acima indicadas:
o
H uma dependncia ortogonal, por parte de todas as camadas MVC2-P, com a camada de
Domnio, alm de utilitrios comuns, resqucios de DTO e contratos de fachada (somente as
Interfaces).
A camada de Domnio, por sua vez, desconhece e independe de quaisquer das camadas MVC2-P.
Ela se torna assim, como de se esperar, a parte mais estvel da arquitetura, funcionando
com um layer ortogonal. O conceito da ortogonalidade pode ser melhor visualizado pelo
rearranjo didtico da Figura A6.20.
Figura A6.20. Rearranjo para visualizao mais didtica da camada Ortogonal - layer.
Entidades no podem acessar DAOs (Data Access Objects) para obter dados. Elas devem
receber dados recuperados por classes de servio da camada Modelo (Manager/Business
Objects-BO ou Application Services-AS) para realizar seus processamentos, tipicamente
regras de negcio.
Os termos entre parnteses sugerem sufixos padres para classes em cada camada, mas podem
ser customizados em nvel corporativo atravs de configuraes nos metadados do jCompany.
Assim, classes de servio da camada Modelo podem ter sufixo padro BO, Manager, Mgr ou
Service, conforme desejado.
Caso a aplicao pretendesse renderizar objetos para mais de uma tecnologia de Viso (Ex.:
HTML e tambm XML/XSLT ou WML), ento seria uma boa escolha separar os pacotes de Viso,
presentes no projeto rhtutorial, em outro projeto independente. Deste modo, poder-se-ia ter
dois projetos para esta camada Viso bem desacoplados.
O mesmo raciocnio valeria, caso a pretenso fosse utilizar duas implementaes de persistncia.
Se fosse o caso, compensaria fatorar o(s) pacote(s) de persistencia do rhtutorial_modelo para
um projeto prprio de persistncia.
Isso porque facilita aos desenvolvedores eventualmente instanciarem dependncias de outras camadas, disponveis globalmente em
um nico Class Path.
Note que, desde que classes de uma camada MVC2-P estejam segmentadas, pelo menos, por pacotes com baixo acomplamento,
reorganizar os projetos no seria uma tarefa complexa. E como veremos, esta uma preocupao do jCompany, que descreveremos
na Viso Interna da arquitetura proposta.
Figura A6.22. Principais pacotes que segmentam internamente as camadas, dentro de projetos.
Nos exemplos em Figura A6.24, Figura A6.25 e Figura A6.26, vemos os arquivos Maven e configuraes
no Eclipse envolvidos. Os mdulos Maven (Projetos que sero alterados e construdos pelo
desenvolvedor) so definidos no arquivo "projeto-pom.xml" e as dependncias Maven nos arquivos
"pom.xml" de cada projeto. A sincronia entre esta definio e o Build Path do Ecilpse automaticamente
realizada pelo plugin M2Eclipse. Notar que este plugin importa "modulos Maven" como "Projetos Eclipse"
e, como veremos mais adiante, outras dependncias (JAR) como Libraries Externas, como deve ser feito:
Figura A6.25. Projeto "principal": Dependncias de mdulos expressas no "pom.xml" e sincronizadas no Eclipse.
Figura A6.26. Projeto "modelo": Dependncias de mdulos expressas no "pom.xml" e sincronizadas no Eclipse.
O projeto "comuns" no possui dependncia dos demais, sendo portanto considerado mais "estvel", do
ponto de vista arquitetural.
#1. Projetos com marca "M", que caracterizam o gerenciamento pelo M2Eclipse.
#2. JARs definidos nos arquivos "pom.xml" e disponveis no repositrio Maven local, agrupados em
"Maven Dependencies".
Obs. 1: Para dependncias somente em tempo de execuo, necessrio o devido registro das
dependncias nos arquivos pom.xml do Maven, mas no necessariamente no Eclipse! O M2Eclipse j
cuida deste tipo de configurao automaticamente.
Obs. 2: Os projetos da camada viso do jCompany so disponibilizados como WAR para o Maven, que
os expande e mescla com o WAR da aplicao (ou EAR) em tempo de montagem para funcionamento em
execuo. Este formato modelado como "PSEUDO-WAR" para distingui-lo de um "WAR" final,
executvel.
Figura A6.30. Modelo de Componentes completo (em nvel macro) para o projeto RH que ser desenvolvido.
As dependncias das camadas de reso Open-Source tambm so importadas como "External Libraries"
no Eclipse pelo M2Eclipse, no havendo distino com relao aos JARs do jCompany, por exemplo.
Figura A6.31. Libraries contendo jCompany e componentes reutilizados (em destaque), gerados pelo M2Eclipse.
mais rigorosa, porm permite a esta ferramenta compreender mais a fundo o projeto (onde esto suas
classes de teste, artefatos de configurao da aplicao etc.) e, por consequncia, contribuir mais.
Seguir o padro de pacotes do Maven nos ajudar na atualizao de verses, gerao de
rotinas de montagem, compilao e liberao de executveis. Alm disso, plugins Maven podero
gerar mtricas interessantes e um Web-Site em nvel 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 exigncias arquiteturais e ir cobrar um maior investimento inicial quando
comparado, por exemplo, ao Apache Ant, mas trar mais retorno, no mdio prazo.
Objetivo
1. src/main/java
(Source Folder)
3. src/test/resources
(Pseudo Source-Folder)
Configurado como Source
folder no Eclipse para melhorar
visualizao no Package
Explorer, muito embora no
contenha classes Java.
4. src/main/config
(Source Folder)
com.powerlogic.jcompany.config.[emp|appl*URLs*]
onde
[emp] contm arquivo package-info.java, que possui anotaes
em nvel da organizao e, portanto, gerais para todos os
projetos. Normalmente, em instalaes corporativas, deve ser
utilizado somente em projetos da camada Bridge e,
eventualmente, utilizados somente para sobreposies de
anotaes especficas.
[app] contm arquivo package-info.java, que possui anotaes
em nvel da aplicao e, portanto, gerais para o projeto corrente.
[*URLs*] subdiretrios que sero criados pelos plugins do
jCompany na medida em que URLs que representem
colaboraes padres sejam geradas. Cada diretrio tem uma
correspondncia um para um com uma URL que siga um padro
do jCompany, e conter um arquivo package-info.java com
metadados. Exemplo:
o
com.powerlogic. jcompany.config.funcionarioman\
package-info.java: anotaes para URL /funcionarioman
com.powerlogic. jcompany.config.funcionariosel\
package-info.java: anotaes para URL /funcionariosel
A organizao baseada em dependncias de tecnologias visa aumentar a estabilidade de cada pacote, mantendo-os com o mnimo
possvel de acoplamentos (imports). So possveis subdivises em pacotes funcionais abaixo do pacote de tecnologia (ex: por Casos
de Uso), ou mesmo alterao desta nfase, colocando-se pacotes funcionais antecedendo os pacotes de tecnologia, se desejado.
O pseudo source-folder webapp merece um maior detalhamento, j que contm diversos diretrios
padro Java EE e arquivos de configurao padres:
Objetivo
1. /plc/midia*
3. /META-INF
4. /WEB-INF/fcls
5. /WEB-INF/
um folder padro Java EE, que deve constar exatamente com este
nome e em maisculas, e deve conter, em sua raiz, arquivos de
configurao diversos.
O template INI padro traz os seguintes arquivos pr-configurados:
importante perceber que o agrupamento de todos estes recursos abaixo da pasta plc proposital e excepcionalmente importante
para a performance das aplicaes, j que todos estes so recursos passiveis de serem mantidos em caching, no cliente (nos
Navegadores). Para acionar este excepcional recurso de performance, o jCompany j traz pr-configurado o filtro PlcClienteFilter no
web.xml, mapeado para todos os arquivos abaixo de /plc. Este mais outro motivo para reforar o uso desta conveno, e agrupar
recursos desta mesma natureza, abaixo deste diretrio.
Objetivo
1. /jsf/AppAction
2. /jsf/AppPhaseListener
3. /listener/AppHttpSessionListener
4. /listener/AppServletContextListener
5. /tiles/AppMenuItemController
6. /AppUsuarioPerfilService
Pela descrio que vimos at aqui, j devemos ter percebido que as classes includas nos projetos
gerados no contm cdigo procedimental em Java. Os poucos artefatos com contedo gerados so
alguns arquivos de JSP e mdias de exemplo para permitirem uma apresentao inicial de Web-Design
para a aplicao, a ser modificada para o contexto de cada empresa/aplicao.
Os verdadeiros propsitos do plugin de criao de projetos, e de outros que compem o jCompany
Artifact Generator, so reforar:
o
As classes Java presentes nos templates INI, portanto, esto vazias, visando apenas promover o uso de
padres de programao da arquitetura.
Nota: Alm disso, estas classes no so instanciadas pelo desenvolvedor, mas por algum esquema de
Inverso de Controle (IoC). O jCompany faz IoC atravs do padro CDI (jCompany 6.x) ou via jBoss
Seam complementado por tcnicas prprias (em verses 5.5.x ou inferiores). Alm disso, reutiliza IoC
clssico para APIs como Listener e Filter, utilizando o web.xml para declarar estas implementaes (at
que o uso de conteiners no padro Java EE 6 se popularizem, de modo a possibilitar o uso de anotaes).
Os diversos mecanismos de IoC utilizados ou implementados pelo jCompany sero discutidos em
detalhe nos captulos de programao de regras de negcio, no mdulo E.
Objetivo
1. src/main/java
(Source Folder)
2. src/main/config
(Source Folder)
4. src/test/java
(Source Folder)
5. (raiz) pom.xml
As classes Java definidas no template INI para projetos modelo tm o seguinte propsito:
Classes Java da Arquitetura pr-definidas no projeto modelo
Classe
Objetivo
1. /facade/AppFacadeImpl
2. /modelo/AppManager
Objetivo
1. src/main/java
(Source Folder)
2. src/main/resources
(Pseudo Source Folder)
Configurado como
Source folder no Eclipse
para melhorar
visualizao no Package
Explorer, muito embora
no contenha classes
Java.
3. src/test/java
(Source Folder)
As classes Java definidas no projeto template default para comuns tm o seguinte propsito:
Classes Java da Arquitetura pr-definidas no projeto comuns
Classe
Objetivo
1. /comuns/AppBaseContextVO
2. /comuns/AppConstantesComuns
3. /comuns/AppException
4. /comuns/AppUsuarioPerfilVO
AppUsuarioPerfilService).
Nota: Est no comuns, obviamente, porque
transportada para camada Modelo, nos contratos
padres do jCompany, para que lgicas de
negcio conheam estes dados.
5. /entidade/AppBaseEntity
6. /facade/IAppFacade
7. /facade/IAppFacadeRemote
Sumrio
Neste captulo, fizemos uma breve reviso sobre preceitos da Arquitetura de Software e discutimos a
Viso Interna e Viso de Mdulos da arquitetura incorporada e proposta pelo jCompany, tomando
como base os trs projetos gerados no captulo anterior.
Ao expormos os critrios (Rationale) utilizados pela Powerlogic para absoro e concepo da
arquitetura sugerida, provemos as condies necessrias para ajustes especficos e especializaes
corporativas que se faam necessrios.
No prximo captulo iremos sair da Arquitetura de Software para ingressar na Metodologia de Construo
Java EE incorporada no jCompany, comeando por entender seus Casos de Uso Padro e a aplicao
que iremos desenvolver mais em detalhes.
O retorno a este captulo, aps uma maior experimentao prtica no jCompany, altamente
recomendvel.