Matéria de Capa

 



Boas Práticas no Desenvolvimento Java Enterprise
Dicas e práticas que fazem a diferença no seu projeto Java EE 

Atualmente, com a grande adoção da plataforma Java Enterprise (conhecida como J2EE) por muitas empresas, de variados segmentos de negócio, nasce a necessidade do uso de boas práticas conhecidas para a plataforma Java Enterprise, além daquelas registradas no JavaBlueprints™, com o intuito de garantir as qualidades funcionais e não-funcionais de sistemas e aplicações construídas usando a Java2 Enterprise Edition. Este artigo orientará arquitetos, projetistas e desenvolvedores no uso de um conjunto de diversas boas práticas para atingir tais qualidades.

Atualmente, com a escassez de recursos tecnológicos, a diminuição de investimentos em TI e o alto índice de “turn-over” de pessoal nas equipes de análise, desenho e desenvolvimento, e implantação de sistemas, se faz necessário a adoção de um manual tecnológico de boas práticas e padrões para Java/J2EE, visando garantir os prazos de implantação sem diminuir a qualidade do software e facilitando a sustentação em ambiente de produção.
Este artigo tem como objetivo reunir e compartilhar experiências em Java/J2EE adquiridas ao longo de 5 anos, buscando a padronização no uso e implementação de componentes de software baseados em Java/J2EE, seguindo as boas práticas da tecnologia Java, da plataforma J2EE e de ambientes de Servidores de Aplicação J2EE.


Boas Práticas de Arquitetura

Os motivos pelos quais uma aplicação Java Enterprise tem problemas de performance, segurança, escalabilidade, e outros, são os mesmo motivos pelos quais aplicações no ambiente MainFrame ou Client/Server têm esses problemas, ou seja, má definição da arquitetura de software geralmente espremida por prazos absurdos de implantação e por falta de levantamento e refinamento de requisitos não-funcionais como: segurança, confiabilidade, disponibilidade e escalabilidade.

O ambiente Java Enterprise por ser um pouco mais complexo que seus primos, exige que aplicações baseadas nessa plataforma tenham um processo de arquitetura melhor elaborado e realizado, e que realmente suporte às qualidades não-funcionais de um software.
Um sistema ou aplicação baseada na plataforma Java Enterprise deve ser componentizada para quebrar a complexidade de construção, desde o Cliente (ClientTier) até os Recursos de Dados (ResourceTier).

Pesquisas, estudos e a vivência do mercado de desenvolvimento apontam que uma implementação ruim no máximo prejudicará a performance e dificultará a manutenção do sistema. Entretanto, uma arquitetura mal concebida e mal elaborada prejudicará cronicamente a performance, escalabilidade, estabilidade e confiabilidade. Ou seja, no desenvolvimento corporativo “enteprise-class” o processo de elaborar, testar e validar uma arquitetura para os sistemas é tão ou mais importante que a própria implementação.

Padrões de Arquitetura

Uma aplicação ou sistema J2EE obrigatoriamente deve ser construído em n-camadas e cada camada tem uma responsabilidade específica.

Experiências de mercado coletadas de empresas de todos os segmentos como: indústria, comércio, financeiro, e-commerce, e outros, têm encontrado equilíbro entre o custo, prazo e qualidade de aplicações Java adotando o modelo cinco-camadas (five-tier model), sendo as camadas propostas e padronizadas dentro da plataforma J2EE no JavaBlueprints™.

Responsabilidade das camadas:

. Client-Tier: exibir os componentes da interface gráfica com o usuário, fornecer os mecanismos   de entrada e saída de dados;

. Presentation-Tier: tratar as ações do usuário e controlar a lógica da apresentação;
. Business-Tier: suportar os componentes que realizam os serviços e processos de negócio;
. Integration-Tier: fornecer serviços de infra-estrutura à camada de negócio;
. Resource-Tier: fornecer o acesso e controle a dados, integrações, conexões. Mensageria, etc.

Para garantir que o modelo de arquitetura seja seguido e verificado, devem ser adotados padrões de semântica para os nomes de todos os componentes, pacotes e classes, respeitando sua camada e responsabilidade, como os padrões do GoF ou J2EE Design Patterns.

Geralmente, para cada tipo de componente, adotamos no nome da classe um sufixo que representa sua responsabilidade e no pacote representamos a qual domínio de negócio e qual camada ele faz parte. Por exemplo:

banco.geral.database.ClienteDAO
banco.geral.ejb.ClienteBean
banco.geral.delegate.ClienteDelegate

Ou seja, os padrões de semântica permitem que os arquitetos, desenvolvedores e projetistas identifiquem rapidamente em qual camada o componente está e qual responsabilidade ele deve desempenhar.

Leia o artigo completo na revista MUNDOJAVA, já nas bancas!



Arquitetura de Camadas em Java EE

Princípios e padrões para a plataforma Java EE


O que são Camadas? Camadas são o mesmo que MVC? Por que não usar Value Objects? O que usar para implementar as tais Camadas? Descubra conceitos, padrões e más práticas arquiteturais para separar as responsabilidades da sua aplicação em Camadas.


A eterna luta pela qualidade no software vem há anos produzindo padrões e técnicas para a construção de sistemas com menos defeitos e de manutenção mais fácil e simples. Ainda na “época de ouro” do Projeto Estruturado de Sistemas foram definidas duas métricas básicas para um módulo de software: Coesão e Acoplamento. Coesão é a medida em que os componentes de um módulo estão relacionados, se eles têm responsabilidades em comum ou se foram apenas agrupados por acaso. Acoplamento diz respeito à independência entre componentes, a medida do impacto que a alteração da implementação de um componente tem sobre outros. Componentes, neste caso, podem ser entendidos como classes em um pacote, linhas de código em um método, responsabilidades de uma classe ou qualquer coisa neste sentido.

A aplicação dessas métricas não está restrita a objetos, trechos de código ou atributos, elas também são aplicadas à arquitetura de uma aplicação. O uso de Camadas (Layers) é um Padrão Arquitetural que ajuda na tarefa de separar responsabilidades, promovendo baixo acoplamento e alta coesão em um sistema.

O objetivo deste artigo é descrever este padrão e apresentar técnicas que ajudam na implementação das Camadas mais comuns: Apresentação, Aplicação, Negócios e Persistência.

O que são Camadas?

Um exemplo clássico de Camadas é o modelo utilizado pelo protocolo TCP/IP (baseado no modelo OSI) mostrado na figura 1.

Cada Camada tem sua responsabilidade. A Camada de Rede não precisa conhecer a implementação da Camada de Enlace de Dados. Tanto faz se a Rede Utiliza Ethernet, Wi-fi, Token Ring, PPP ou qualquer outro protocolo, desde que a implementação cuide das responsabilidades que lhe são devidas. Um outro exemplo, mostrado na figura 2, é uma aplicação Java EE comum.

Nesse caso, a sua aplicação roda num Servidor de Aplicações (como o Jakarta Tomcat ou JBoss). Este por sua vez roda em uma Máquina Virtual Java, que roda sobre um Sistema Operacional, que por sua vez roda sobre o hardware. Para sua aplicação, não importa se o sistema operacional é Windows ou Linux, se a JVM é da Sun ou da Bea, mas costuma importar qual é o servidor de Aplicações utilizado. Da mesma forma, a JVM precisa saber em qual Sistema Operacional está rodando porque sua implementação varia de acordo com esse. A JVM não tem necessidade alguma de saber se está sendo utilizada para rodar um Servidor de Aplicações ou um jogo feito em Java, para ela tanto faz.

Partindo desses exemplos, vamos conceituar Camadas:

Camadas são divisões lógicas de componentes agrupados por responsabilidades em comum.

Isso significa dizer que uma Camada irá agrupar classes, pacotes e outros componentes que possuam responsabilidades em comum. As classes responsáveis por uma determinada funcionalidade serão agrupadas em uma Camada. Essa separação promove a coesão na medida que classes relacionadas estão juntas, e evita o acoplamento porque a comunicação entre Camadas é feita de maneira controlada.

Idealmente, Camadas se comunicam apenas com Camadas adjacentes.

Nem sempre este princípio pode ser seguido, mas o ideal é que assim como na pilha TCP/IP mostrada, as Camadas se comuniquem apenas com as Camadas vizinhas. No exemplo, a Camada de Aplicação se comunica apenas com a Camada de Transporte, ela nunca fará contato direto com outra Camada.

Nos sistemas modernos, existem dois tipos de Camadas: Físicas e Lógicas. Normalmente as Camadas Físicas são chamadas em inglês de tiers enquanto as lógicas são conhecidas como layers. Isso não é uma regra e em português usa-se a mesma palavra para ambas. Não existe relação predefinida entre Camadas Lógicas e Físicas num sistema, uma Camada Física pode hospedar diversas Camadas Lógicas ou uma Camada Lógica pode se espalhar por diversas Camadas Físicas.

Como qualquer técnica, o uso de Camadas têm vantagens e desvantagens. Algumas das vantagens das Camadas:

. reduzem complexidade: agrupam componentes e simplificam a comunicação entre eles;
. reduzem dependência/acoplamento: a regra de comunicação evita dependências diretas entre   componentes de Camadas diferentes;
. favorecem a coesão: componentes de responsabilidades relacionadas são agrupados;
. promovem reusabilidade: camadas podem ser reutilizadas em outros sistemas ou podem ser   substituídas;
. é um Padrão Arquitetural conhecido: facilita a comunicação e entendimento entre   desenvolvedores.

E entre as desvantagens:

. limitadas pela tecnologia: algumas regras precisam ser quebradas por limitações tecnológicas;
. apenas complicam um sistema muito simples: não é qualquer sistema que exige o uso de   Camadas;
. possibilidade de overdose: muitos arquitetos acabam criando Camadas demais e tornando a   aplicação extremamente complexa.

Camadas Físicas

Uma camada física é formada por objetos em um sistema distribuído que se comunicam. Não estamos falando de objetos Java (instâncias de uma classe) aqui, a palavra “objeto” no vocabulário de Sistemas Distribuídos é utilizada para os elementos do sistema: servidores, clientes, equipamentos de rede, etc. O agrupamento destes objetos, forma as Camadas Físicas em um sistema.

Geralmente, Camadas Físicas são utilizadas para melhorar a administração do sistema e aumentar a escalabilidade. Segurança também pode ser um motivo forte ao se decidir por essa arquitetura. Por exemplo, poderíamos ter como Camada Física um grupo de servidores de Bancos de Dados, ou como Camada Física web um conjunto formado por load-balancers e máquinas com servidores Web que se comunicam com uma Camada formada por servidores onde estão as regras de negócio do sistema.

Elementos que formam Camadas Físicas podem ser, entre outros:

. JVMs (mesmo que sejam duas JVM rodando numa mesma máquina);
. Servidor;
. Computador Pessoal;
. Servidor de Aplicações;
. CPU;
. Dispositivo móvel (celular, PDA, etc.).


Leia o artigo completo na revista MUNDOJAVA, já nas bancas!



 




 
© 2003 - MundoJava - Todos os direitos reservados <design: www.id-art.com.br >