Arquitetura de Camadas em Java™ Enterprise Edition™ Phillip Calçado
<ul><li>Descrever e conceituar Arquitetura de Camadas em JEE™ </li></ul><ul><li>Apresentar e discutir técnicas para criaçã...
<ul><li>Orientação a Objetos, Java™, Java EE™, Web... o de sempre ! </li></ul>Pré-Requisitos (Pentium IV, 512 MB RAM DDR,....
(A gente veio aqui pra beber ou conversar?) <ul><li>Quem é Você? </li></ul><ul><li>O que são Camadas </li></ul><ul><li>Cam...
<ul><li>Phillip Calçado,  a.k.a.   Shoes </li></ul><ul><li>Programador desde 1996 </li></ul><ul><li>Com Java desde 2003  (...
(Por que esse povo de Java fala tanto em camadas?) O que são Camadas
(Por que esse povo de Java fala tanto em camadas?) O que são Camadas <ul><li>Divisão Lógica de componentes de software (la...
(Por que esse povo de Java fala tanto em camadas?) O que são Camadas <ul><li>Algumas Vantagens: </li></ul><ul><li>Reduzem ...
<ul><li>Formada por nós que se comunicam </li></ul><ul><li>Um nó nesse contexto é uma unidade de processamento: </li></ul>...
(Das geladeiras pretas aos celulares) Camadas Físicas - Evolução <ul><li>Fase 1: Mainframes </li></ul><ul><ul><li>Tudo no ...
<ul><li>2, 3, 4 ou N Camadas?  </li></ul><ul><li>Camada de Apresentação  é a Interface </li></ul><ul><li>Camada de Aplicaç...
(“Ah, as famosas três camadas. Massa, recheio e cobertura. A culinária francesa em geral  me decepciona, mas as sobremesas...
(O pecado original) A maioria esmagadora dos sistemas construídos usando  Java™ EE™ não são e  nunca serão  altamente dist...
(Em VB não tem essas frescuras...) Camadas Lógicas em Java EE™ - Exemplos
(Ou: Não Fale com Estranhos) <ul><li>Camadas deveriam ser empilhadas, mais básicas abaixo, mais especificas acima </li></u...
(Como perder dinheiro fácil) <ul><li>Golden Hammer:  Camadas para Tudo e Todos </li></ul><ul><li>Queimando Etapas:  Interf...
(Quando a Sun vai atualizar aqueles diagramas?) Convidado Especial: DTOs Locais <ul><li>DTOs foram criados para reduzir cu...
(Do laod que se vê) Camada de Apresentação <ul><li>Interação entre usuário/subsistema e sistema </li></ul><ul><li>Pode ser...
(Ah, enfim algo produtivo...) Smart UI: A GUI que Sabe o que Faz Camada de Apresentação: Alternativas
(Ah, enfim algo produtivo...) Smart UI: A GUI que Sabe o que Faz Camada de Apresentação: Alternativas <ul><li>Chamadas à i...
(Toda vez que voce usa Struts, Deus mata um bebe foca. Pense nas pobres foquinhas, e parem de usar esse lixo. Por favooooo...
(Toda vez que voce usa Struts, Deus mata um bebe foca. Pense nas pobres foquinhas, e parem de usar esse lixo. Por favooooo...
(Alguém tem que controlar essa bagunça!) Camada de Aplicação <ul><li>Coordena Casos de Uso </li></ul><ul><li>Controla como...
(Não julgue um livro pela capa) Façade: Tudo na Interface Camada de Aplicação: Alternativas
(Não julgue um livro pela capa) Façade: Tudo na Interface Camada de Aplicação: Alternativas <ul><li>Expõe conceitos, não i...
(Back to the future) Commands: A Herança Camada de Aplicação: Alternativas
(Back to the future) Commands: A Herança Camada de Aplicação: Alternativas <ul><li>Fácil de entender </li></ul><ul><li>Atô...
(Let the Show begin!) Camada de Negócios <ul><li>Chamada também de  Camada de Domínio </li></ul><ul><li>Modela o domínio d...
(Já vi esse filme antes...) Transaction Script: Quase um Command Camada de Negócios: Alternativas
(Já vi esse filme antes...) Transaction Script: Quase um Command Camada de Negócios: Alternativas <ul><li>Simples </li></u...
(Orientação a Objetos é sobre o que mesmo?) Domain Model: Como no Livro Camada de Negócios: Alternativas
(Orientação a Objetos é sobre o que mesmo?) Domain Model: Como no Livro Camada de Negócios: Alternativas <ul><li>Melhor ma...
(Como assim?) Camada de Persistência <ul><li>Responsável por armazenar objetos </li></ul><ul><li>Não prevista num modelo p...
(“Objetos são tabelas que acham que são gente...” - DBA Anônimo) Active Record: Não dá para Esquecer Camada de Persistênci...
(“Objetos são tabelas que acham que são gente...” - DBA Anônimo) Active Record: Não dá para Esquecer Camada de Persistênci...
(Se era mais fácil usar um banco OO? NÃO!) Data Mapper: Ei, alguém sabe fazer isto! Camada de Persistência: Alternativas
(Se era mais fácil usar um banco OO? NÃO!) Data Mapper: Ei, alguém sabe fazer isto! Camada de Persistência: Alternativas <...
(Não era mais fácil usar um banco OO?) Active Mapped Record: O Melhor dos Dois Mundos Camada de Persistência: Alternativas
(Não era mais fácil usar um banco OO?) Active Mapped Record: O Melhor dos Dois Mundos Camada de Persistência: Alternativas...
(Canhões, moscas...ah, você sabe!) <ul><li>Não Compensa em: </li></ul><ul><ul><li>Aplicações simples que não fazem mais qu...
Conclusão <ul><li>Camadas != MVC </li></ul><ul><li>Na grande maioria das vezes, DTOs são inúteis </li></ul><ul><li>Não exi...
<ul><li>Craig Larman  – Applying UML and Patterns </li></ul><ul><li>Eric Evans  – Domain-Driven Design </li></ul><ul><li>B...
GUJ - Fórum de Design
Contato http://www.fragmental.com.br http://www.riojug.org http://www.guj.com.br [email_address]
Que Zahl os Acompanhe... Obrigado!
Upcoming SlideShare
Loading in...5
×

Arquitetura de Camadas em Java EE - Maraton4Java 2005

8,434

Published on

Palestra sobre arquitetura de camadas em Java para o Maratona4Java de Brasília.Slides em PDF disponíveis.

Essa palestra originou o artigo Arquitetura de Camadas em Java EE publicado na revista Mundo Java número 15.

Apresentada em 19/11/2005.

http://blog.fragmental.com.br/wiki/index.php/Maratona4Java2005:_Arquitetura_de_Camadas_em_Java%E2%84%A2_Enterprise_Edition

Published in: Technology

Transcript of "Arquitetura de Camadas em Java EE - Maraton4Java 2005"

  1. 1. Arquitetura de Camadas em Java™ Enterprise Edition™ Phillip Calçado
  2. 2. <ul><li>Descrever e conceituar Arquitetura de Camadas em JEE™ </li></ul><ul><li>Apresentar e discutir técnicas para criação e integração destas </li></ul><ul><li>Se divertir no processo </li></ul>Objetivos (Tentar dominar o mundo!) (Droga! Sabia que devia ter ido pro bar...) Não São Objetivos <ul><li>Mudar as suas convicções, sua cabeça, sua religião, seu time de futebol... </li></ul>
  3. 3. <ul><li>Orientação a Objetos, Java™, Java EE™, Web... o de sempre ! </li></ul>Pré-Requisitos (Pentium IV, 512 MB RAM DDR,...)
  4. 4. (A gente veio aqui pra beber ou conversar?) <ul><li>Quem é Você? </li></ul><ul><li>O que são Camadas </li></ul><ul><li>Camadas Físicas </li></ul><ul><li>Camadas Lógicas </li></ul><ul><li>Camadas em Java™ EE™ </li></ul><ul><li>Integração entre Camadas: Boas Praticas </li></ul><ul><li>Integração entre Camadas: Más Praticas </li></ul><ul><li>Camada de Apresentação: Alternativas </li></ul><ul><li>Camada de Aplicação: Alternativas </li></ul><ul><li>Camada de Negócios: Alternativas </li></ul><ul><li>Camada de Persistência: Alternativas </li></ul><ul><li>Conclusão </li></ul>Agenda
  5. 5. <ul><li>Phillip Calçado, a.k.a. Shoes </li></ul><ul><li>Programador desde 1996 </li></ul><ul><li>Com Java desde 2003 (“¡ adios, C++ !”) </li></ul><ul><li>Coordenador do GUJ </li></ul><ul><li>JUG Leader do RioJUG </li></ul><ul><li>Consultor, instrutor, coach </li></ul><ul><li>Diversos projetos open-source (alguns chegaram até a ter uma versão 1.0!) </li></ul><ul><li>Escritor ocasional (http://www.fragmental.com.br) </li></ul><ul><li>Aplicações para análise de risco, redes GSM, gestão de conteúdo, setor financeiro, biologia... A grande maioria utilizando Java EE </li></ul>Quem é Você?
  6. 6. (Por que esse povo de Java fala tanto em camadas?) O que são Camadas
  7. 7. (Por que esse povo de Java fala tanto em camadas?) O que são Camadas <ul><li>Divisão Lógica de componentes de software (layer) ou hardware (tier) </li></ul><ul><li>Separam componentes por responsabilidade comum </li></ul><ul><li>Se comunicam de cima para baixo (quase sempre) </li></ul><ul><li>Camadas Famosas: </li></ul><ul><ul><li>TCP/IP </li></ul></ul><ul><ul><li>Sistemas Operacionais </li></ul></ul><ul><ul><li>Java </li></ul></ul><ul><ul><li>.Net </li></ul></ul>
  8. 8. (Por que esse povo de Java fala tanto em camadas?) O que são Camadas <ul><li>Algumas Vantagens: </li></ul><ul><li>Reduzem complexidade </li></ul><ul><li>Reduzem dependência / acoplamento </li></ul><ul><li>Favorecem a coesão </li></ul><ul><li>Promovem reusabilidade </li></ul><ul><li>São um Padrão conhecido </li></ul><ul><li>Algumas Desvantagens </li></ul><ul><li>Limitadas pela tecnologia </li></ul><ul><li>Não existe um mercado de COTS </li></ul><ul><li>Apenas complicam um sistema muito simples </li></ul><ul><li>Arquitetos megalomaníacos adoram </li></ul>
  9. 9. <ul><li>Formada por nós que se comunicam </li></ul><ul><li>Um nó nesse contexto é uma unidade de processamento: </li></ul><ul><ul><li>JVM </li></ul></ul><ul><ul><li>Servidor </li></ul></ul><ul><ul><li>Computador Pessoal </li></ul></ul><ul><ul><li>Servidor de Aplicações </li></ul></ul><ul><ul><li>CPU </li></ul></ul>(Das geladeiras pretas aos celulares) Camadas Físicas
  10. 10. (Das geladeiras pretas aos celulares) Camadas Físicas - Evolução <ul><li>Fase 1: Mainframes </li></ul><ul><ul><li>Tudo no mesmo nó </li></ul></ul><ul><li>Fase 2: Cliente/Servidor </li></ul><ul><ul><li>Banco de dados separado </li></ul></ul><ul><ul><li>Interface separada </li></ul></ul><ul><ul><li>Regra de negócios acoplada com Interface ou Banco de Dados </li></ul></ul><ul><li>Fase 3: 3-Tier </li></ul><ul><ul><li>Um nó para persistência, um para Negócios e um ou mais para interface </li></ul></ul><ul><li>Fase 4: n-Tier </li></ul><ul><ul><li>Um nó por conceito </li></ul></ul>
  11. 11. <ul><li>2, 3, 4 ou N Camadas? </li></ul><ul><li>Camada de Apresentação é a Interface </li></ul><ul><li>Camada de Aplicação coordena casos de uso </li></ul><ul><li>Camada de Negócios é onde fica a Lógica de negócios </li></ul><ul><li>Camada de Persistência são os componentes que salvam o estado do objeto em algum lugar </li></ul><ul><li>... </li></ul>(“Ah, as famosas tres camadas. Massa, recheio e cobertura. A culinaria francesa em geral me decepciona, mas as sobremesas sao sempre otimas. “ – Carlos Villela - GUJ ) Camadas Lógicas
  12. 12. (“Ah, as famosas três camadas. Massa, recheio e cobertura. A culinária francesa em geral me decepciona, mas as sobremesas são sempre ótimas. – Carlos Villela - GUJ) Camadas Lógicas - Evolução <ul><li>Sistemas Operacionais </li></ul><ul><ul><li>I/O </li></ul></ul><ul><ul><li>Gerência de memória </li></ul></ul><ul><li>Bancos de Dados </li></ul><ul><ul><li>Gerência dos Dados </li></ul></ul><ul><li>Interfaces de Usuário </li></ul><ul><ul><li>Independência de Interface </li></ul></ul><ul><ul><li>Paradigma Web/HTTP </li></ul></ul><ul><li>Middleware </li></ul><ul><ul><li>RPC </li></ul></ul><ul><ul><li>Mensagens </li></ul></ul><ul><li>Regras de Negócio </li></ul><ul><ul><li>Funcional </li></ul></ul><ul><ul><li>OO </li></ul></ul>
  13. 13. (O pecado original) A maioria esmagadora dos sistemas construídos usando Java™ EE™ não são e nunca serão altamente distribuídos Camadas Físicas em Java EE™ <ul><li>Java EE pressupõe sistemas altamente distribuídos </li></ul><ul><li>EJBs foram criados para ambientes altamente distribuídos </li></ul><ul><li>Design Patterns Java EE™ são gambiarras para sistemas altamente distribuídos </li></ul><ul><li>Mas... </li></ul>
  14. 14. (Em VB não tem essas frescuras...) Camadas Lógicas em Java EE™ - Exemplos
  15. 15. (Ou: Não Fale com Estranhos) <ul><li>Camadas deveriam ser empilhadas, mais básicas abaixo, mais especificas acima </li></ul><ul><li>Dependência é sempre de cima para baixo </li></ul><ul><li>Utilize Depedency Injection para integrar Camadas </li></ul><ul><li>Camadas escondem as inferiores das superiores </li></ul><ul><li>A camada de cima conhece a i nterface da inferior, nunca sua implementação </li></ul>Integração entre Camadas: Boas Praticas
  16. 16. (Como perder dinheiro fácil) <ul><li>Golden Hammer: Camadas para Tudo e Todos </li></ul><ul><li>Queimando Etapas: Interface conecta com Persistência </li></ul><ul><li>Decomposição Funcional: Commands como Funções </li></ul><ul><li>Gordura Extra: Não expor operações de baixa granularidade </li></ul><ul><li>Despachante: Camada transparente que não faz nada </li></ul><ul><li>Mochileiro das Galáxias: Objeto vai do fundo ao topo das camadas,ou vice-versa </li></ul><ul><li>Data Transfer Objects (DTO/VO/TO) : entre camadas em mesmo nó </li></ul>Integração entre Camadas: Más Praticas
  17. 17. (Quando a Sun vai atualizar aqueles diagramas?) Convidado Especial: DTOs Locais <ul><li>DTOs foram criados para reduzir custo de chamadas RPC </li></ul><ul><li>Padrão VO/TO é para vencer os problemas dos Entity Beans </li></ul><ul><li>Não faz sentido dentro do mesmo nó </li></ul><ul><li>Provoca hierarquia de classes duplicada </li></ul><ul><li>Não faz sentido com Lazy-Loading </li></ul><ul><li>Pode fazer algum sentido para encapsular Camadas </li></ul>Integração entre Camadas: Más Praticas
  18. 18. (Do laod que se vê) Camada de Apresentação <ul><li>Interação entre usuário/subsistema e sistema </li></ul><ul><li>Pode ser gráfica, textual, XML, CSV... </li></ul><ul><li>Responde a estímulos do usuário e exibe seus resultados </li></ul><ul><li>Não contêm Lógica de Negócios </li></ul>
  19. 19. (Ah, enfim algo produtivo...) Smart UI: A GUI que Sabe o que Faz Camada de Apresentação: Alternativas
  20. 20. (Ah, enfim algo produtivo...) Smart UI: A GUI que Sabe o que Faz Camada de Apresentação: Alternativas <ul><li>Chamadas à interface realizam regras de negócio </li></ul><ul><li>Alta produtividade </li></ul><ul><li>Muito comum em Delphi/VB e demais </li></ul><ul><li>Desenvolvedores menos experiente se sentem confortáveis </li></ul><ul><li>Ferramentas RAD ajudam bastante </li></ul><ul><li>Código repetido aos montes </li></ul><ul><li>Alto acoplamento e baixa coesão </li></ul><ul><li>Programação Orientada a Telas, não a Objetos </li></ul><ul><li>Incompatível com um Domain Model </li></ul><ul><li>Integração entre aplicações extremamente complicada </li></ul>
  21. 21. (Toda vez que voce usa Struts, Deus mata um bebe foca. Pense nas pobres foquinhas, e parem de usar esse lixo. Por favooooooooooooooooooor. – Carlos Villela – GUJ) MVC: Subcamadas Camada de Apresentação: Alternativas
  22. 22. (Toda vez que voce usa Struts, Deus mata um bebe foca. Pense nas pobres foquinhas, e parem de usar esse lixo. Por favooooooooooooooooooor. – Carlos Villela – GUJ) MVC: Subcamadas Camada de Apresentação: Alternativas <ul><li>Apresentação dividida entre View e Controller </li></ul><ul><li>Separação de responsabilidades </li></ul><ul><li>Vários e vários frameworks e ferramentas </li></ul><ul><li>MVC para web não é MVC , é Front Controller </li></ul><ul><li>Costuma-se confundir MVC com Camadas </li></ul><ul><li>Modelo não é Persistência </li></ul>
  23. 23. (Alguém tem que controlar essa bagunça!) Camada de Aplicação <ul><li>Coordena Casos de Uso </li></ul><ul><li>Controla como os Objetos de Negócio são utilizados </li></ul><ul><li>Muitas vezes é diluída entre Camada de Apresentação e Camada de Negócios </li></ul>
  24. 24. (Não julgue um livro pela capa) Façade: Tudo na Interface Camada de Aplicação: Alternativas
  25. 25. (Não julgue um livro pela capa) Façade: Tudo na Interface Camada de Aplicação: Alternativas <ul><li>Expõe conceitos, não implementação </li></ul><ul><li>Controla bem Casos de Uso </li></ul><ul><li>Garante consistência: só é possível entrar o que foi planejado </li></ul><ul><li>Limita uso de Camada de Negócios </li></ul><ul><li>Pouca reusabilidade: e o que não foi previsto? </li></ul>
  26. 26. (Back to the future) Commands: A Herança Camada de Aplicação: Alternativas
  27. 27. (Back to the future) Commands: A Herança Camada de Aplicação: Alternativas <ul><li>Fácil de entender </li></ul><ul><li>Atômico </li></ul><ul><li>Se não formalizada uma Camada de Aplicação, facilmente implementado com MVC </li></ul><ul><li>Programação altamente Procedural </li></ul><ul><li>Explosão de Commands e baixíssima reusabilidade </li></ul><ul><li>Camada de Aplicação não é limitada a Request/Response </li></ul>
  28. 28. (Let the Show begin!) Camada de Negócios <ul><li>Chamada também de Camada de Domínio </li></ul><ul><li>Modela o domínio do problema </li></ul><ul><li>É o sistema! </li></ul>
  29. 29. (Já vi esse filme antes...) Transaction Script: Quase um Command Camada de Negócios: Alternativas
  30. 30. (Já vi esse filme antes...) Transaction Script: Quase um Command Camada de Negócios: Alternativas <ul><li>Simples </li></ul><ul><li>Rápido </li></ul><ul><li>Não recomendado para lógica de negócios que não seja só tira-e-põe do banco de dados </li></ul><ul><li>Programação Procedural sem objetos inteligentes </li></ul><ul><li>Incompatível com um Domain Model </li></ul><ul><li>Repetição de código </li></ul><ul><li>Baixa Reusabilidade </li></ul>
  31. 31. (Orientação a Objetos é sobre o que mesmo?) Domain Model: Como no Livro Camada de Negócios: Alternativas
  32. 32. (Orientação a Objetos é sobre o que mesmo?) Domain Model: Como no Livro Camada de Negócios: Alternativas <ul><li>Melhor maneira de modelar problemas em OOP </li></ul><ul><li>Eficaz para Lógica Complexa </li></ul><ul><li>Altamente Orientado a Objetos </li></ul><ul><li>Complexo demais para cosias muito simples </li></ul><ul><li>Baixa produtividade: programadores não estão acostumados </li></ul><ul><li>Tecnologia limita seu uso </li></ul>
  33. 33. (Como assim?) Camada de Persistência <ul><li>Responsável por armazenar objetos </li></ul><ul><li>Não prevista num modelo puramente OO, objetos seriam eternos </li></ul><ul><li>Geralmente utiliza SGBDR, o que complica seu uso </li></ul>
  34. 34. (“Objetos são tabelas que acham que são gente...” - DBA Anônimo) Active Record: Não dá para Esquecer Camada de Persistência: Alternativas
  35. 35. (“Objetos são tabelas que acham que são gente...” - DBA Anônimo) Active Record: Não dá para Esquecer Camada de Persistência: Alternativas <ul><li>Simples </li></ul><ul><li>Rápido </li></ul><ul><li>Quebra completamente camadas </li></ul><ul><li>Sem semântica: objeto é seu próprio repositório </li></ul><ul><li>Ruim para atualizações em lote </li></ul>
  36. 36. (Se era mais fácil usar um banco OO? NÃO!) Data Mapper: Ei, alguém sabe fazer isto! Camada de Persistência: Alternativas
  37. 37. (Se era mais fácil usar um banco OO? NÃO!) Data Mapper: Ei, alguém sabe fazer isto! Camada de Persistência: Alternativas <ul><li>Simples </li></ul><ul><li>Rápido </li></ul><ul><li>Mantêm Objetos de Negócio ignorantes sobre persistência </li></ul><ul><li>Facilita testes podendo ser substituído </li></ul><ul><li>Um passo “artificial” a mais em qualquer execução </li></ul><ul><li>Quando persistir? </li></ul><ul><li>Explosão de Classes </li></ul><ul><li>Sem um bom framework pode ser improdutivo </li></ul><ul><li>Sem lazy-loading fica complexo </li></ul>
  38. 38. (Não era mais fácil usar um banco OO?) Active Mapped Record: O Melhor dos Dois Mundos Camada de Persistência: Alternativas
  39. 39. (Não era mais fácil usar um banco OO?) Active Mapped Record: O Melhor dos Dois Mundos Camada de Persistência: Alternativas <ul><li>Simples </li></ul><ul><li>Rápido </li></ul><ul><li>Pode ser obtido com superclasses ou AOP </li></ul><ul><li>Não quebra Camadas </li></ul><ul><li>Não tem problema de “quando persistir?” </li></ul><ul><li>Objetos precisam (uma hora ou outra) saber que não são persistidos automaticamente </li></ul><ul><li>Não elimina Repositórios nem DAOs </li></ul><ul><li>Não funciona para grandes volumes de dados </li></ul><ul><li>Pode gerar inconsistência se o cliente não salvar o objeto </li></ul><ul><li>Experimental </li></ul>
  40. 40. (Canhões, moscas...ah, você sabe!) <ul><li>Não Compensa em: </li></ul><ul><ul><li>Aplicações simples que não fazem mais que tirar e colocar registros no banco </li></ul></ul><ul><ul><li>Protótipos </li></ul></ul><ul><ul><li>Partes da Aplicação com Relatórios Pesados </li></ul></ul><ul><li>Possíveis Soluções Menos Problemáticas: </li></ul><ul><ul><li>Groovy / BeanShell / Jython / jRuby </li></ul></ul><ul><ul><li>Ruby on Rails/ PHP </li></ul></ul><ul><ul><li>Shell Scripts / Ruby / Python / PERL </li></ul></ul><ul><ul><li>Ferramentas do SGBD </li></ul></ul><ul><ul><li>Ferramentas RAD </li></ul></ul>Quando Não Usar Camadas
  41. 41. Conclusão <ul><li>Camadas != MVC </li></ul><ul><li>Na grande maioria das vezes, DTOs são inúteis </li></ul><ul><li>Não existe “a maneira certa”, existe “a mais adequada” e esta varia com os requisitos </li></ul><ul><li>Flexibilidade é importante mas complexidade reduzida também (talvez mais) </li></ul><ul><li>A tecnologia ainda é fator limitante para o desenvolvimento OO </li></ul>
  42. 42. <ul><li>Craig Larman – Applying UML and Patterns </li></ul><ul><li>Eric Evans – Domain-Driven Design </li></ul><ul><li>Bertrand Meyer – Object-Oriented Software Construction </li></ul><ul><li>Martin Fowler – Refactoring, PEAI, Analysis Patterns... </li></ul><ul><li>Rod Johnson – J2EE Development Without EJB </li></ul><ul><li>Bruce Tate & Justin Gehtland – Better, Faster, Lighter Java </li></ul><ul><li>Meilir Page-Jones – Fundamentals of Object-Oriented Design Using UML </li></ul><ul><li>Andrew Hunt & David Thomas – The Pragmatic Programmer </li></ul>Autores Recomendados
  43. 43. GUJ - Fórum de Design
  44. 44. Contato http://www.fragmental.com.br http://www.riojug.org http://www.guj.com.br [email_address]
  45. 45. Que Zahl os Acompanhe... Obrigado!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×