Padrões Arquiteturais no Java EE 7



Documentos relacionados
Argo Navis J931 - Padrões de Design J2EE. Introdução. Objetivos de aprender padrões J2EE. Conhecer padrões para uso na plataforma J2EE

UFG - Instituto de Informática

SISTEMA DE WORKFLOW PARA MODELAGEM E EXECUÇÃO DE PROCESSOS DE SOFTWARE. Aluno: Roberto Reinert Orientador: Everaldo A. Grahl

PROGRAMAÇÃO SERVIDOR PADRÕES MVC E DAO EM SISTEMAS WEB. Prof. Dr. Daniel Caetano

HIBERNATE EM APLICAÇÃO JAVA WEB

SISTEMA DE AGENDAMENTO E GERENCIAMENTO DE CONSULTAS CLÍNICAS

UFG - Instituto de Informática

Conteúdo. Disciplina: INF Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo

ABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE

Padrões de projeto 1

UFG - Instituto de Informática

Projeto Demoiselle. Para perguntas e respostas, utilizem a lista de discussões de usuários da comunidade: demoiselle-users@lists.sourceforge.

BRAlarmExpert. Software para Gerenciamento de Alarmes. BENEFÍCIOS obtidos com a utilização do BRAlarmExpert:

Padrões de Projeto. Prof. Jefersson Alex dos Santos

Hoje é inegável que a sobrevivência das organizações depende de dados precisos e atualizados.

Fábrica de Software 29/04/2015

SISTEMA TYR DIAGRAMAS DE CLASSE E SEQUÊNCIA Empresa: Academia Universitária

Unidade 8: Padrão MVC e DAO Prof. Daniel Caetano

Documento de Arquitetura

Web Services. (Introdução)

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES

CURSO DESENVOLVEDOR JAVA WEB E FLEX Setembro de 2010 à Janeiro de 2011

UNIVERSIDADE FEDERAL DA BAHIA INSTITUTO DE MATEMÁTICA CIÊNCIA DA COMPUTAÇÃO LINGUAGENS PARA APLICAÇÃO COMERCIAL. Java Peristence API 1.

Aplicativo web para definição do modelo lógico no projeto de banco de dados relacional

Como sobreviver com Java 2? Saulo Arruda

SISTEMA GERENCIADOR DE BANCO DE DADOS

Governança de TI. ITIL v.2&3. parte 1

UNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação

UTILIZAÇÃO DA TECNOLOGIA ENTERPRISE JAVABEANS NO DESENVOLVIMENTO DE APLICAÇÕES DISTRÍBUIDAS

GERADOR DE CÓDIGO JSP BASEADO EM PROJETO DE SGBD. Acadêmico: Maicon Klug Orientadora: Joyce Martins

Padrões de Interação com o Usuário

MVC e Camadas - Fragmental Bliki

ENTERPRISE JAVABEANS 3. Msc. Daniele Carvalho Oliveira

UNIDADE 4. Introdução à Metodologia de Desenvolvimento de Sistemas

Prática da Disciplina de Sistemas Distribuídos Serviços Web IFMA DAI Professor Mauro Lopes C. Silva

Sistemas Distribuídos na WEB (Plataformas para Aplicações Distribuídas) Sumário. Java 2 Enterprise Edition. J2EE (Java 2 Enterprise Edition)

PRODUTO 1 (CONSTRUÇÃO DE PORTAL WEB)

Linguagem de Programação JAVA. Professora Michelle Nery Nomeclaturas

Programação com acesso a BD. Prof.: Clayton Maciel Costa clayton.maciel@ifrn.edu.br

Documento de Projeto de Sistema

LINGUAGEM DE BANCO DE DADOS

Introdução à Linguagem Java

Automação de Locais Distantes

Desenvolvimento de aplicação web com framework JavaServer Faces e Hibernate

Prototype, um Design Patterns de Criação

Integração de sistemas utilizando Web Services do tipo REST

CURSO DESENVOLVEDOR JAVA Edição 2010

4 - Padrões da Camada de Integração. Introdução

Persistência de dados com JPA. Hélder Antero Amaral Nunes

SISTEMAS DISTRIBUÍDOS

Desenvolvendo uma Arquitetura de Componentes Orientada a Serviço SCA

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

04/08/2012 MODELAGEM DE DADOS. PROF. RAFAEL DIAS RIBEIRO, MODELAGEM DE DADOS. Aula 2. Prof. Rafael Dias Ribeiro. M.Sc.

Padrão Arquitetura em Camadas

Framework. Marcos Paulo de Souza Brito João Paulo Raittes

Web Services. Autor: Rômulo Rosa Furtado

UML 01. Curso Superior de Tecnologia em Banco de Dados Disciplina: Projeto de Banco de Dados Relacional 1 Prof.: Fernando Hadad Zaidan

CURSO DESENVOLVEDOR JAVA Edição Intensiva de Férias

Varejo Digital Automação Comercial para Cupom Fiscal Eletrônico

2 Engenharia de Software

Padrões. Projeto (Design) de Software

Persistência de Dados em Java com JPA e Toplink

DIMENSIONANDO PROJETOS DE WEB-ENABLING. Uma aplicação da Análise de Pontos de Função. Dimensionando projetos de Web- Enabling

ANEXO 11. Framework é um conjunto de classes que colaboram para realizar uma responsabilidade para um domínio de um subsistema da aplicação.

CURSO DE PROGRAMAÇÃO EM JAVA

Nome: Login: CA: Cidade: UF CARTÃO RESPOSTA QUESTÃO RESPOSTA QUESTÃO RESPOSTA

3 Um Framework Orientado a Aspectos para Monitoramento e Análise de Processos de Negócio

Sistema Gerenciador de Conteúdo OpenCms: um caso de sucesso no CEFET-MG

PadrãoIX. Módulo II JAVA. Marcio de Carvalho Victorino. Servlets A,L,F,M

PADRÕES DE SOFTWARE. Jerffeson Teixeira de Souza, Ph.D. Tarciane de Castro Andrade. Grupo de Padrões de Software da UECE (GPS.

MBA Inteligência Competitiva Com ênfase em BI/CPM. Metadados

Análise e Projeto Orientados por Objetos

Argo Navis J931 - Padrões de Design J2EE. Versão 2.0 (setembro de 2003) Objetivos

DESENVOLVIMENTO WEB UTILIZANDO FRAMEWORK PRIMEFACES E OUTRAS TECNOLOGIAS ATUAIS

Entrar neste site/arquivo e estudar esse aplicativo Prof. Ricardo César de Carvalho

Resumo: Perguntas a fazer ao elaborar um projeto arquitetural

Padrões de Projeto WEB e o MVC

Curso Tecnológico de Redes de Computadores 5º período Disciplina: Tecnologia WEB Professor: José Maurício S. Pinheiro V

Fase 1: Engenharia de Produto

3 Arquitetura do Sistema

1. Quem somos nós? A AGI Soluções nasceu em Belo Horizonte (BH), com a simples missão de entregar serviços de TI de forma rápida e com alta qualidade.

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

ANEXO V Edital nº 03508/2008

Ferramenta de apoio a gerência de configuração de software. Aluno: Rodrigo Furlaneto Orientador: Everaldo Artur Grahl

UM ESTUDO SOBRE ARQUITETURA PARA DESENVOLVIMENTO DE SOFTWARE WEB UTILIZANDO NOVAS TECNOLOGIAS

USANDO O IZCODE PARA GERAR SOFTWARE RAPIDAMENTE

3 Serviços na Web (Web services)

UNIVERSIDADE FEDERAL DE SANTA MARIA CENTRO DE TECNOLOGIA AULA 14 PROFª BRUNO CALEGARO

Considerações no Projeto de Sistemas Cliente/Servidor

Backup.

Adriano Reine Bueno Rafael Barros Silva

Plano de Gerenciamento do Projeto

SISTEMAS DISTRIBUIDOS

Conceitos de Banco de Dados

5 Framework para coordenação e mediação de Web Services para ambientes de aprendizado à distância

Forneça a próxima onda de inovações empresariais com o Open Network Environment

Transcrição:

Padrões Arquiteturais no Java EE 7 Vagner F. Le Roy Júnior Curso de Pós Graduação em Arquitetura de Software Distribuído Pontifícia Universidade Católica de Minas Gerais Belo Horizonte, MG Brasil vagnerleroy@gmail.com Abstract. This article seeks to present, analyze and demonstrate, through UML diagrams and source code, applying some design patterns in the architecture of the Java EE7. The main patterns in this document are: Service Façade, DAO, Persistent Domain Object and Data Transfer Object. Resumo. Este artigo busca apresentar, analisar e demonstrar, por meio de diagramas UML e códigos fonte, a aplicação de alguns padrões de projeto na arquitetura do Java EE7. Os principais padrões abordados neste documento são: Service Façade, DAO, Persistent Domain Object e Data Transfer Object. 1. Introdução Projetar sistemas orientados a objetos é difícil, e projetar sistemas orientados a objetos reutilizáveis é ainda mais difícil. Para nos ajudar nesta árdua tarefa, as melhores práticas utilizadas por diversos profissionais ao redor do mundo, envolvendo a construção destes sistemas, foram catalogadas durante o passar dos anos tornando-as conhecidas simplesmente como padrões de projetos ou design patterns. Um padrão nada mais é que uma descrição de uma solução comprovada para um problema recorrente de design, com especial ênfase sobre o contexto, as forças que cercam o problema, as consequências, e o impacto da solução. Os padrões de projeto ficaram popularmente difundidos em 1995 após o lançamento do livro Design Patterns: Elements of Reusable Object-Oriented Software, dos autores Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides, conhecidos como a Gangue dos Quatro (Gang of Four ou simplesmente GoF). Os padrões de projeto visam facilitar o desenvolvimento de software oferecendo os seguintes benefícios: Soluções provadas: padrões refletem a experiência, conhecimento e insights de desenvolvedores que têm usado com sucesso esses padrões em seu próprio trabalho. Reutilizáveis: padrões proporcionam uma solução pronta que pode ser adaptada a diferentes problemas como necessário. Expressivos: padrões fornecem um vocabulário comum de soluções que podem expressar grandes soluções de forma sucinta. Este artigo busca demonstrar, por meio de códigos fonte e diagramas UML, um breve resumo de algumas das melhores práticas envolvendo padrões de projeto na tecnologia Java EE 7.

2. Java EE Em 1992, a Sun Microsystems criou um grupo conhecido como Green Team com o objetivo de desenvolver inovações tecnológicas. Este time então apresentou a ideia de criar um interpretador (o que seria mais tarde a JVM) para facilitar o desenvolvimento de aplicações que rodassem em diversos dispositivos, como vídeo-cassestes, televisões, aparelhos médicos, etc. Por motivos de conflitos de interesses e custo, o projeto não foi bem sucedido. Com a chegada da Web em 1995, a Sun percebeu a oportunidade de desenvolver aplicações que rodassem em diversos browsers e em diversos sistemas operacionais (os chamados applets), não apenas renderizando HTML, mas oferecendo aplicações ricas do lado do cliente. Surgia-se então o Java 1.0. Apesar de ter sido criado com este intuito, os applets caíram em desuso e a tecnologia se focou principalmente no lado do servidor. No ano de 1997 é lançada a versão 1.1 da J2EE, incluindo a primeira versão do principal componente da versão Enterprise, o EJB. Em 1999 é lançada a J2EE 1.2 (Java 2 Enteprise Edition) com bibliotecas e APIs com foco em aplicações distribuídas, tolerante a falhas, multicamadas e baseada em componentes reutilizáveis do lado do servidor. Já em 2006, com o lançamento da versão 5, a plataforma então muda de nome de J2EE para Java EE. Atualmente na sétima versão, e preste ao lançamento da oitava, a tecnologia Java se encontra composta por 3 grandes famílias: Java SE: núcleo central da tecnologia Java. Oferece desde tipos básicos até APIs de alto nível. Muito utilizada por aplicações Desktop. Java ME: fornece API e máquina virtual leve. É voltada para pequenos dispositivos e sua API é um subconjunto da Java SE. Java EE: estende a Java SE incluindo componentes e APIs para desenvolvimento de grandes aplicações corporativas. Com o crescimento de aplicações Java EE e a necessidade de cada vez mais atingir requisitos não-funcionais que permeiam as grandes aplicações Web, surgiram boas práticas e padrões para ajudar o desenvolvedor a vencer estes desafios. Alguns destes padrões serão discutidos em seguida!

Figura 1. Organização em camadas de uma aplicação Java EE. 3. Service Façade (Application Service) Session Façades provêm uma implementação do padrão Façade [Gof] utilizando session beans. No entanto, em um projeto que não é utilizado EJB, podemos utilizar POJOs (Plain and Old Java Objects) no lugar dos EJB. Para prover um vocabulário comum ao discutir Façades, tanto para EJB, quanto para POJOs, foi criado o termo Service Façade. 3.1. Problema A motivação para utilizarmos um Application Service em um contexto orientado a serviços é a seguinte: Centralizar a regra de negócio em vários componentes e serviços da camada de negócios. O acesso aos componentes de lógica de negócio tem que ser o mais conveniente e mais consistente possível tornando necessário uma API de alta granularidade.

3.2. Forças O estado do componente após a invocação da Service Façade deve permanecer consistente. A realização por trás da fachada de serviço deve ser encapsulada. A interface da Service Façade deve ser utilizável como um serviço remoto. Em caso de alteração, a assinatura dos métodos expostos devem permanecer estáveis e compatíveis. 3.3. Solução Com o EJB 3.1, não é mais necessário implementarmos a interface do Bean (apesar de ser recomendável para fins de testes) e nem especificarmos os wrappers locais e remoto. Sendo assim, um Service Façade é composto por uma interface de negócio local e sua implementação, isto é, um Session Bean Stateless. Em Java EE, a principal responsabilidade de um Service Façade é ainda a composição de serviços independentes e reutilizáveis, mas para casos de uso simples, pode-se implementar diretamente a lógica de negócios sem delegá-la a outros componentes. Figura 2. ServiceFaçade em Java EE Em cenários mais complexos, um Service Façade coordena alguns serviços ou DAOs. A interface de negócios remota deve ser utilizada apenas por clientes remotos, porém, sempre que possível, a interface local deve ser acessada em seu lugar. 4. DAO (Data Access Object) A ideia original para o padrão DAO era fornecer um mecanismo que permitisse alterar a fonte de dados independente do seu tipo de armazenamento (Banco de dados relacionais, banco de dados orientado a objetos, LDAP, arquivos textos), sem alterar o restante da lógica da aplicação. Sendo assim, a principal motivação deste padrão é

querer separar a lógica de negócios da realização concreta dos mecanismos de armazenamento de dados. 4.1. Problema O problema real deste padrão é seu uso excessivo. Alterar o mecanismo de banco de dados ou até mesmo o fornecedor em um projeto real não é realista e na maioria dos casos, necessário. Uma aplicação que utiliza SQL dificilmente será portada para LDAP. Mesmo com os recursos do JPA introduzidos no Java EE, a abstração total da camada de acesso a dados em raros casos é feita. Utilizamos esta abordagem somente em casos muito simples. Quando necessitamos de consultas sofisticadas, utilizamos um DAO. 4.2. Forças Há a necessidade de se acessar uma fonte de dados legada ou algum outro recurso que não seja compatível com JPA. É necessário manter testável a abstração de acesso a dados. É dissociar a implementação proprietária do acesso aos recursos do resto da aplicação. A aplicação é orientada a serviços: a lógica de negócio e acesso a dados são separados. É necessário ter que lidar com fontes de dados legados não padronizadas. As queries são muito complexas e é importante mantê-las em um lugar separado. 4.3. Solução Em um ambiente Java EE, não é necessário utilizarmos a JDBC para acessarmos o banco de dados. Pode-se utilizar a linguagem genérica de consultas da JPA, bem como SQL nativo. A JPA fornece, através do objeto Entity Manager, métodos como UPDATE, DELETE, INSERT para trabalharmos diretamente com objetos ao invés de utilizar a API JDBC de baixo nível. O acesso é simples e o Entity Manager pode ser injetado diretamente a qualquer session bean:

O JPA fornece somente uma interface e podemos mudar a sua implementação apenas mudando uma linha de código no arquivo persistent.xml. Vários fabricantes implementam a especificação JPA e disponibilizam produtos como Hibernate, Eclipse Link. Veja abaixo um exemplo desta configuração utilizando o framework Hibernate: O Entity Manager é uma abstração do provedor de serviços JPA e pode ser encarado como uma implementação genérica do padrão DAO, podendo ser injetado diretamente em uma classe de serviço. Em Java EE, o padrão DAO é opcional e não é a

única forma de acessar o armazenamento de dados. Em suma, pequenos projetos que utilizam de simples CRUD, podem utilizar um Entity Manager injetado em uma classe de serviço para fazer acesso aos dados, porém, grandes projetos corporativos podem ainda necessitar da camada de DAO. Veja na figura abaixo um diagrama de classes representando o padrão DAO em Java EE: Figura 3. Padrão DAO em Java EE 6 5. Persistent Domain Object (Business Object) O Objetivo deste padrão é implementar um modelo de domínio com a lógica de negócios e seus relacionamentos. Em J2EE, o uso de modelos procedurais já eram condenados, porém, a tecnologia não ajudava o desenvolvedor com ferramentas que o ajudassem no seu trabalho. Mais tarde, ferramentas como Hibernate foram desenvolvidas tornando a persistência nos modelos de domínio transparente. 5.1. Problema O uso de roteiros de transação em aplicações funciona bem até que seja necessário colocar comportamentos específicos em objetos. Muitas vezes, esses comportamentos específicos são implementados com o uso de estruturas condicionais (if, else...) tornando o código difícil de manter, testar e de evoluir. O uso do modelo procedural infere em modelos anêmicos (classes sem lógica de negócio, somente com getters e setters) que não aproveitam os recursos da orientação à objetos como polimofirmo e herança, obrigando que as verificações sejam feitas em classes de Serviços ou Façades. A maioria destes problemas é causada pela falta de orientação a objetos na camada de persistência da aplicação. 5.2. Forças A lógica de negócios é complexa O modelo conceitual pode ser derivado a partir dos requisitos e mapeado para objetos de domínio.

Os objetos de domínio precisam ser mantidos em um banco de dados relacional (é o caso mais comum). Os casos de uso, histórias de usuários ou outros documentos de especificação já descrevem o domínio de destino de forma orientada a objetos. A relação entre o comportamento e os dados podem ser derivados a partir da especificação. 5.3. Solução A solução é se preocupar primeiramente com a lógica de negócios e modelar as classes sem se preocupar com a camada de persistência. Questões como a modelagem de classes coesas com estado encapsulado, comportamento co-relacionado e herança devem ser priorizadas. A JPA é bastante flexível e pode se adequar facilmente a um modelo rico de objetos. Classes que utilizam heranças e pesquisas polimórficas são perfeitamente mapeadas em seus objetos de domínio. Modelos anêmicos não possuem, por definição, comportamento o que leva a lógica da aplicação para classes de serviços. Essas classes precisam acessar atributos do modelo, e isso é feito geralmente com getters e setters. Este tipo de abordagem não apresenta um grande problema, mas ofusca a lógica de domínio da aplicação. O maior problema está nas estruturas condicionais que são exigidas para diferenciar os tipos de entidade. Essas estruturas são necessárias para compreender o comportamento dependente do tipo de uma forma procedural. 6. Transfer Object e Data Transfer Object O surgimento desse padrão se deu pela necessidade de transferir múltiplos dados entre aplicações corporativas ou camadas remotas. Em J2EE, a utilização de sucessivas chamadas a métodos remotos para buscar atributos causava danos no desempenho da aplicação. Como solução, criaram objetos de transferência de dados (DTO) para diminuir este impacto. Porém, com a chegada do Java EE e a introdução do JPA, o problema original para qual este padrão foi criado, foi solucionado. 6.1. Problema Em Java EE, o desprendimento de entidades persistentes solucionou o problema original. Não há mais a necessidade de se criar mais uma camada para transferir dados, bastando apenas a entidade JPA implementar a interface java.io.serializable, tornando possível sua navegação por camadas locais ou remotas. Em J2EE, o bean CMP (Container Managed Persistent) não era serializável, o que obrigava o desenvolvedor a implementar uma nova camada na aplicação. Os DTO se tornaram aplicáveis em Java EE quando se deseja fornecer diversas visões para a camada de persistência sem alterar a interface externa. Isto é muito utilizado no mundo SOA, já que mudanças internas não podem quebrar o contrato de serviço. Sua aplicação como proxy se dá no ambiente SOA - um DTO pode ser utilizado como proxy para reduzir o acoplamento entre serviços inter-relacionados e quando se deseja melhorar o desempenho de casos de uso que possuem entidades fortemente

conectadas. É mais rápido transferir apenas um subconjunto de entidades interrelacionadas e que são de interesse do consumidor, do que transferir todas entidades. 6.2. Forças Há a necessidade manter o serviço externo compatível. As mudanças de um cliente não devem afetar os outros. A transferência de dados entre entidades profundamente interligadas precisa ser otimizada. É necessário diferentes visões para um único modelo de domínio. Os dados de recursos e sistemas de informação devem ser transferidos para o cliente. Há a necessidade de se comunicar com um legado, de recursos orientados para o conjunto de dados com POJOs. Transportar meta-dados da camada de apresentação para construção de UI s em tempo real. Entidades JPA orientadas a objeto precisam ser transformadas em um formato simplificado para a transferência de dados sobre RESTFul, SOAP, CORBA, ou até mesmo ASCII. 6.3. Solução A solução para este problema se tornou trivial com a chegada da interface java.io.serializable no jdk 1.1. Em caso de transportamos a entidade para outra JVM, precisamos apenas que a entidade implemente a interface java.io.serializable. Desta forma, o estado do objeto é transportado pelos atributos e são acessíveis por meios de métodos getters e setters, utilizando reflexão. Veja o exemplo abaixo:

Para melhorar a performance, podemos, ao invés de utilizar a interface Serializabe, utilizarmos Externalizable, que diminui o tamanho dos dados trafegados além de evitar o uso da reflexão: 7. Conclusão Neste trabalho foi apresentado alguns dos principais padrões utilizados no Java EE 7. Como vimos, estes padrões resolvem uma série de problemas que o desenvolvimento utilizando Java nos traz. Alguns destes padrões foram remodelados, a partir do catálogo de padrões e boas práticas blueprints do J2EE, para o Java EE, tornando mais simples desenvolver aplicações em Java. Vale salientar que a aplicação de padrões exige um estudo detalhado do problema, identificando todas suas variáveis e avaliando qual será o impacto da utilização daquele padrão na arquitetura do sistema. Portanto, aplicar padrões é uma forma segura de resolver problemas já conhecidos no desenvolvimento de sistema e sua utilização deve-se restringir somente em casos que haja realmente a necessidade, pois sua aplicação sem um estudo prévio e profundo pode tornar a arquitetura confusa, além de não conseguir resolver o problema em questão. 8. Referências BIEN, Adam. Real World Java EE Patterns: Rethinking Best Practices. [s. L.]: Lulu.com, 2009. 280 p. GAMMA, Erich et al. Design patterns: elements of reusable object-oriented software. Pearson Education, 1994. Linha de Código, Design Patterns Fundamentais do J2EE. Disponível em: < http://www.linhadecodigo.com.br/artigo/363/design-patterns-fundamentais-doj2ee.aspx> Acesso em 04 de maio de 2014.

Oracle, Java BluePrints. Disponível em: < http://www.oracle.com/technetwork/java/blueprints-141945.html> Acesso em 31 de outubro de 2014. Caelum, O que é java. Disponível em: <http://www.caelum.com.br/apostila-javaorientacao-objetos/o-que-e-java/#2-2-uma-breve-historia-do-java2014> Acesso em 10 de outubro de 2014.