© casa do código - cloud object storage | store & retrieve …€¦ ·  · 2014-04-16casa do...

23

Upload: hahanh

Post on 26-May-2018

273 views

Category:

Documents


2 download

TRANSCRIPT

© Casa do Código

Todos os direitos reservados e protegidos pela Lei nº9.610, de 10/02/1998.

Nenhuma parte deste livro poderá ser reproduzida, nem transmitida, sem auto-

rização prévia por escrito da editora, sejam quais forem os meios: fotográficos,

eletrônicos, mecânicos, gravação ou quaisquer outros.

Casa do Código

Livros para o programador

Rua Vergueiro, 3185 - 8º andar

04101-300 – Vila Mariana – São Paulo – SP – Brasil

Design Patterns com Java: Projeto orientado a objetos guiado por padrões

/ Eduardo Guerra

São Paulo: Casa do Código, 2013

ISBN 978-85-66250-11-4

Casa do Código

Agradecimentos Pessoais

Meu primeiro agradecimento é a Deus, por Ele ter me proporcionado tudo para quetrilhasse o caminho que trilhei até chegar onde estou agora. Por ter colocado as pes-soas certas para me ajudar em minhas di�culdades, por ter me colocado obstáculosnas horas adequadas que me permitiram amadurecer para superar obstáculos mai-ores no futuro e por ter me iluminado no momento das decisões mais críticas queacabaram direcionando minha vida no futuro.

Em seguida envio meu “muito obrigado” para meus pais, José Maria e Maria daGraça, que sempre me incentivaram e me apoiaram em minhas escolhas. Mesmoestando distantes �sicamente hoje, sei que todos os dias eles rezam e torcem pormim. Imagino direitinho eles mostrando esse livro para todo mundo com o maiororgulho! Aproveito essa oportunidade para estender esse agradecimento para todaminha família, em especial para minha Tia Dorinha que sempre esteve ao meu ladoquando precisei.

Agradeço também a Maria Eduarda, a Duda, minha �lha mais velha, por trazersó alegria desde que chegou nesse mundo. Seu jeito amigo e carinhoso me confortasempre que por algummotivo estou para baixo. Não sei como tanta bondade e paci-ência pode caber em apenas uma pessoa. Soumuito grato pelo seu companheirismo,como quando ela senta domeu lado bem agarradinha para assistir um �lme ou jogarum videogame.

Seguindo para a mais nova da família, agradeço a Ana Beatriz, a Bia, por con-ter a maior concentração de energia e alegria de todo mundo. Apesar de ser bembagunceira e gostar de um alvoroço, ela sempre faz alguma coisa que consegue tiraruma gargalhada de nossa boca nas horas mais inesperadas. É até difícil de descrevera alegria que sinto quando eu chego e essa baixinha vem gritando o meu nome e dáum abraço na minha perna.

Deixei para o �m os agradecimentos para minha companheira de toda vida, mi-nha esposa Roberta, ou, como eu a chamo, Lindinha. Acho que ela não temnoção do

i

Casa do Código

amor que sinto por ela e como sua presença é central em minha vida. Eu agradeçoa ela por através de suas ações ter se tornado a pessoa mais importante da minhavida. Sem ela eu seria incompleto e não teria estrutura para ter trilhado o caminhoque segui emminha vida até esse momento. Muito obrigado por todo seu apoio, portodo seu amor e por todo seu carinho!

ii

Casa do Código

Agradecimentos Pro�ssionais

Antes de mencionar alguém de forma especí�ca, gostaria de agradecer a todos meusprofessores, colegas de trabalho, amigos e companheiros que de alguma forma con-tribuíram parameu conhecimento eme incentivaram a seguir em frente. Nossa vidaé feita de pessoas e de experiências, e é a partir disso que seguimos nossos caminhose realizamos nossas escolhas.

Primeiramente deixo um agradecimento institucional ao ITA, um instituto queé referência nacional e internacional em engenharia, em onde me formei em Enge-nharia da Computação e �z meumestrado e doutorado. Além disso, também foi umlocal onde tive a oportunidade de atuar como professor por mais de � anos. Foramexperiências quememarcaram e são uma importante parte daminha história. Eu saído ITA, mas com certeza o ITA não saiu de mim! Agradeço em especial ao profes-sor Clovis Fernandes, meu orientador na graduação, no mestrado e no doutorado.Um grande amigo, que sempre me incentivou e que foi grande mentor, cujos ensina-mentos forammuito além de questões técnicas. Espero ainda fazermosmuitas coisasjuntos!

Agradeço a revista MundoJ, principalmente ao Marco Guapo, inicialmente porter aberto espaço para que escrevesse sobre minhas ideias e meus conhecimentos.Em seguida, Guapo con�ou a mim o conteúdo da revista como editor-chefe. Atra-vés da minha atuação na revista eu pude aprender muita coisa e me manter sempreatualizado durante os últimos anos. Através dos artigos que escrevi ganhei experiên-cia e tomei gosto pela escrita de conteúdo técnico. Posso a�rmar com certeza que asemente desse livro foi plantada em alguns de meus artigos durante os últimos anos.Espero que essa parceria ainda dure bastante tempo!

Agradeço também a comunidade de padrões, tanto nacional quanto internaci-onal, por ter me in�uenciado com toda sua cultura e ideias. Sou grato por teremme recebido de braços abertos e por terem fornecido um forum onde foi possíveldebater as minhas ideias e obter feedback dos trabalhos que estou realizando. Agra-

iii

Casa do Código

deço em especial pelo apoio e incentivo de Fabio Kon, Fábio Silveira, Je�erson Souza,Uirá Kulezsa, Ademar Aguiar e Filipe Correia. Também agradeço pelos meus gurusJoseph Yoder e Rebecca Wirfs-Brock, com quem aprendi demais e tive discussõesmuito interessantes sobre modelagem e arquitetura de so�ware.

Agradeço ao INPE, instituição onde acabei de ingressar, por ter me recebido debraços abertos e pela con�ança que tem depositado emmeu trabalho. Espero poderdar muitas contribuições e desenvolver diversos trabalhos interessantes durante osanos que estão por vir!

Finalmente agradeço aCasa doCódigo pelo convite para escrita desse livro. Ape-sar da vontade sempre ter existido, o convite de vocês foi o estopim para que esseprojeto se tornasse algo concreto. Deixo um agradecimento em especial ao editordesse livro, Paulo Silveira, pelos questionamentos e sugestões que contribuíram deforma de�nitiva para o conteúdo desse livro.

iv

Casa do Código

Minibiogra�a do Autor

Eduardo Martins Guerra nasceu em Juiz de Fora em ���� e cursou o ensino básicoe médio em escola pública, o Colégio de Aplicação João XXIII. Desde essa época elejá despertou seu interesse pela programação, começando com a digitação de códigoBasic que vinha em revistas no seu defasado computador Exato Pro. A diversãoera mais ver o efeito de pequenas modi�cações no código do que o jogo que saiacomo resultado. Nessa época, pouco depois, também fez um curso de Clipper, ondedesenvolveu seu primeiro so�ware: um gerenciador de canil!

Incentivado por seus professores, pela facilidade com disciplinas na área de exa-tas, prestou o vestibular para o ITA em ����, logo após o término de seus estudos, efoi aprovado. Durante o curso, ele optou pela carreiramilitar e pelo curso de compu-tação, além de participar de atividades extracurriculares como projetos para a em-presa júnior e aulas no curso pré-vestibular para pessoas carentes, CASD Vestibu-lares. Nesses cinco anos, Eduardo se apaixonou pela área de desenvolvimento deso�ware e pela possibilidade de usar constantemente sua criatividade para proporsempre soluções inteligentes e inovadoras. Dois dias depois de se formar, casou-secom sua mais forte paixão, sua esposa atual, Roberta.

Após formado, em ����, foi alocado no Centro de Computação da Aeronáuticade São José dos Campos (CCA-SJ), onde �caria pelos próximos � anos. Durante esseperíodo, trabalhou com o desenvolvimento de so�ware operacional para atender asnecessidades da Força Aérea Brasileira, adquirindo uma valiosa experiência na área.

No �nal de ����, comdedicação em tempo parcial, Eduardo conseguiu seu títulode mestre em Engenharia da Computação e Eletrônica apresentando a dissertação“Um Estudo sobre Refatoração de Código de Teste”. Nesse trabalho, Eduardo desen-volve sua paixão pelo design de so�ware, realizando um estudo inovador sobre boaspráticas ao se codi�car testes automatizados. Essa dissertação talvez tenha sido umdos primeiros trabalhos acadêmicos no Brasil no contexto de desenvolvimento ágil.No ano de conclusão de seu mestrado, veio sua primeira �lha, Maria Eduarda.

v

Casa do Código

Devido sua sede de conhecimento, ainda nesse período, estudou por conta pró-pria e tirou sete certi�cações referentes a tecnologia Java, sendo na época um dospro�ssionais brasileiros com maior número de certi�cações na área. Além disso,ocupa o cargo de editor-chefe da revista MundoJ desde ����, na qual já publicoudezenas de artigos técnicos de reconhecida qualidade. Esses fatos lhe deram umavisão da indústria de desenvolvimento de so�ware que foi muito importante em suatrajetória, direcionando sua pesquisa e seus trabalhos para problemas reais e rele-vantes.

No CCA-SJ, Eduardo atuou de forma decisiva no desenvolvimento de fra-meworks. Seus frameworks simpli�caram a criação das aplicações e deram maiorprodutividade para a equipe de implementação. Um deles, o SwingBean, foi trans-formado em um projeto open-source e já possui mais de ���� downloads. A grandeinovação e diferencial de seus frameworks estava no fato de serem baseados emme-tadados. A partir desse caso de sucesso, ele decidiu estudar mais sobre como a utili-zação de metadados poderia ser feita em outros contextos. Foi uma surpresa desco-brir que, apesar de outros frameworks líderes de mercado utilizarem essas técnicas,ainda não havia nenhum estudo sobre o assunto. Foi, então, que Eduardo começousua jornada para estudar e tornar acessível o uso dessa técnica por outros desenvol-vedores, pois ele sabia do potencial que os frameworks baseados emmetadados tempara agilizar o desenvolvimento de so�ware e o tornar mais �exível.

Então, em ����, ele ingressou no curso de doutorado do ITA pelo Programade Pós-Graduação em Aplicações Operacionais – PPGAO. A pesquisa sobre fra-meworks baseados em metadados se encaixava perfeitamente no objetivo do pro-grama. A criação de arquiteturas �exíveis, nas quais se pode acrescentar funcionali-dade de forma mais fácil, é algo crítico para aplicações de comando e controle, focode uma das áreas do programa. Orientado pelo professor Clovis Torres Fernandes,começou uma pesquisa que envolveu a análise de frameworks existentes, a abstraçãode técnicas e práticas, a criação de novos frameworks de código aberto e a execuçãode experimentos para avaliar os conceitos propostos.

Foi nessa época que Eduardo começou a participar e se envolveu na comunidadede padrões. Em ���� submeteu para o SugarLoafPLoP em Fortaleza os primeirospadrões que identi�cou em frameworks que utilizavammetadados. Nesse momentoele se empolgou com o espírito de colaboração da comunidade de padrões, onderecebeu um imenso feedback do trabalho que estava realizando. Desde então se tor-nou um membro ativo da comunidade, publicando artigos com novos padrões emeventos no Brasil e no exterior. Além disso, em ���� participou da organização do

vi

Casa do Código

MiniPLoP Brasil, em ���� foi o primeiro brasileiro a ser chair da principal conferên-cia internacional de padrões, o PLoP, e em ���� está também participando tambémda organização do próximo MiniPLoP.

Enquanto realizava seu doutorado, Eduardo foi incorporado, ainda como mili-tar, no corpo docente do Departamento de Ciência da Computação do ITA, ondepôde desenvolver uma nova paixão: ensinar! Durante esse período, ministrou au-las na graduação e em cursos de especialização, e orientou uma série de trabalhosque, de certa forma, complementavam e exploravam outros aspectos do que estavadesenvolvendo em sua tese. Em consequência do bom trabalho realizado, foi con-vidado por três vezes consecutivas para ser o professor homenageado da turma degraduação Engenharia da Computação e duas vezes para a turma de especializaçãoem Engenharia de So�ware.

Em ����, apresentou seu doutorado chamado “A Conceptual Model forMetadata-based Frameworks e concluiu com sucesso essa jornada que deixou di-versas contribuições. Devido a relevância do tema, foi incentivado pelos membrosda banca a continuar os estudos que vem realizando nessa área. Apesar da tese tertrazido grandes avanços, ele tem consciência que ainda há muito a ser feito. Uma desuas iniciativas nessa área foi o projeto Es�nge (http://es�nge.sf.net) , que é um pro-jeto guarda-chuva para a criação de diversos frameworks com essa abordagem base-ada em metadados. Até o momento já existem três frameworks disponíveis e váriosartigos cientí�cos em cima de inovações realizadas nesses projetos. No mesmo anoque terminou seu doutorado, veio sua segunda �lhinha, a Ana Beatriz.

Em ����, Eduardo prestou concurso para o Instituto Nacional de Pesquisas Es-paciais, onde assumiu o cargo de pesquisador no início ����. Hoje ele segue com suapesquisa na área de arquitetura, testes e design de so�ware, buscando aplicar as téc-nicas que desenvolve para projetos na área espacial. Adicionalmente, atua como do-cente na pós-graduação de Computação Aplicada desse instituto, onde busca passaro conhecimento que adquiriu e orientar alunos para contribuírem com essas áreas.

vii

Casa do Código

Por que mais um livro de padrões?

O primeiro livro de padrões “Design Patterns: Elements of Reusable Object-Oriented So�ware”, conhecido como Gang of Four (GoF), já foi lançado a mais de�� anos e de forma alguma seu conteúdo está ultrapassado. Em minha opinião, esselivro foi algomuito a frente de seu tempo, sendo quemuitas de suas práticas só foramser utilizadas de forma efetiva pela indústria alguns anos depois. Durante esses anos,diversos livros sobre esses padrões foram escritos, apresentando sua implementaçãoem outras linguagens ou ensinando-os de forma mais didática. Desse contexto po-dem surgir as seguintes perguntas: será que é preciso mais um livro sobre padrões?O que esse livro trás de diferente?

Durante esses últimos anos tive diversos tipos de experiência que me �zerem terdiferentes visões sobre os padrões. Dentre essas experiências eu posso citar o ensinodemodelagemde so�ware e padrões, a utilização de padrões para o desenvolvimentode frameworks e aplicações, a identi�cação de novos padrões a partir do estudo deimplementações existentes e discussões na comunidade sobre padrões e sua aplicabi-lidade. A partir disso acredito que tive a oportunidade de ter uma visão diferenciadasobre esses padrões, e é essa visão que procuro passar nesse livro. As seções a seguirdescrevem alguns diferenciais desse livro em relação a outros existentes.

Uma Sequência Didática para Aprendizado

Percebi que muitos cursos sobre padrões, sendo eles dados por universidades ouempresas de treinamento, vão ensinando os padrões umpor um. Mas qual é amelhorordem para o ensino e a assimilação dos padrões? Isso era algo que era decididopor cada professor. Uma ordem inadequada nesse aprendizado pode impedir que oaluno não compreenda os princípios por trás da solução do padrão, o que di�cultasua compreensão a respeito de sua aplicabilidade e suas consequências. Isso tambémpode causar uma visão limitada da solução do padrão, o que impede sua adaptaçãopara outros contextos similares.

ix

Casa do Código

Esse livro procura organizar os padrões emuma sequência didática para o apren-dizado. Cada capítulo agrupa os padrões pelo tipo de técnica que utilizam em suasolução ou pelo tipo de problema que resolvem. Dessa forma, ao ver uma mesmatécnica ser utilizada em padrões diferentes é possível compreender melhor a sua di-nâmica e de que formas diferentes ela pode ser utilizada. Em capítulos que focamem tipos de problema, a visão das diferentes alternativas de solução e das suas di-ferenças, cria um senso crítico a respeito das possíveis alternativas de modelagem equais os critérios que devem ser considerados para sua escolha.

Isso faz com que esse livro vá além da apresentação dos padrões e seja na verdadea respeito de técnicas para modelagem orientada a objetos. Os padrões são utiliza-dos como uma referência para a discussão de cada uma dessas técnicas. Dessa forma,esse livro é recomendado para utilização como material base em cursos de gradua-ção ou pós-graduação a respeito de técnicas de programação orientada a objetos ouprogramação orientada a objetos avançada.

Relação entre Padrões

Outro problema que percebo é que os padrões tendem a ser olhados de formaindividual. Isso é uma consequência do formato que os padrões possuem e do fatode serem autocontidos, ou seja, toda informação sobre o padrão estar contida emsua descrição. Isso por um lado é bom pois permite que alguém obtenha todas asinformações sobre um determinado padrão em apenas um local. Porém, por outrolado, perde-se um pouco a ideia a respeito do relacionamento entre os padrões. Ape-sar de haver uma seção que descreve os padrões relacionados, ainda é uma descriçãopequena para uma questão de tamanha importância.

Apresentar o relacionamento entre os padrões foi um dos objetivos desse livro.Apesar de cada padrão apresentar uma solução independente, é da combinação en-tre eles que é possível criar uma sinergia para criação de soluções ainda melhores.Dessa forma, a medida que o livro vai seguindo, e novos padrões vão sendo apresen-tados, existe uma preocupação em mostrar como eles podem ser combinados comos padrões anteriores ou como eles podem ser utilizados como uma alternativa a umoutro padrão. Esse tipo de discussão é importante, pois além de saber a solução dopadrão, também é essencial saber quando aplicá-la.

Refatoração para Padrões

A modelagem de uma aplicação é uma questão dinâmica que evolui a medida

x

Casa do Código

que o desenvolvimento do so�ware vai seguindo seu curso. Apesar de ainda sercomumamodelagemdas classes da aplicação a partir de diagramas antes do inicio daimplementações, muitas vezes os problemas aparecem somente depois. Sendo assim,tão importante quanto saber como utilizar os padrões na modelagem inicial, é sabercomo refatorar um código existente para uma solução que utilize um determinadopadrão. A refatoração constante do código é hoje uma das bases para a manutençãode sua qualidade ao longo do projeto.

Dessa forma, além de apresentar os padrões, esse livro também se preocupa emmostrar quais os passos que precisariam ser feitos para refatorar um código existenteemdireção a umdeterminado padrão. Este assunto, que já foi tema de um livro dedi-cado somente a ele, aqui é apresentado de forma �uida juntamente com os padrões.Isso é importante para que o leitor possa ter uma visão, não apenas estática em rela-ção a utilização de um padrão, mas de como um código existente pode evoluir e sermelhorado a partir de sua introdução a partir de pequenos passos.

Exemplos Realistas e do Dia-a-dia

Pormais que diagramas sejamúteis para que se tenha uma visão geral de uma so-lução, os desenvolvedores ainda temmuito a cultura do “showme the code”, querendover na prática como um padrão pode ser implementado. Por mais que o GoF tenhasido um livro a frente de seu tempo, ele utiliza exemplos que hoje estão distantes deum desenvolver comum, como a criação de uma suite de componentes grá�cos ouum editor de texto. Alguns outros livros acabam trazendo “toy examples”, que seriamexemplos simples e didáticos, mas que são fora do contexto de aplicações reais.

Acho muito importante que o leitor se identi�que com os exemplos e faça umaligação com o tipo de so�ware que desenvolve. Ao se ver próximo aos exemplos epossuir uma experiência anterior com aquele tipo de problema, é muito mais fácilcompreender as questões que estão envolvidas e as alternativas de solução com suasrespectivas consequências. Nesse livro, busquei trabalhar com exemplos recorrentesem aplicações desenvolvidas por grande parte dos programadores, como geração derelatórios, carrinho de compras em aplicações de e-commerce e geração de arquivospara integração entre aplicações. Acredito que assim �cará bem mais claro comocada um poderá utilizar esses padrões em seu dia-a-dia.

Dicas e Referências para Implementações em Java

Muitos padrões apresentados por esse livro são amplamente utilizados em fra-

xi

Casa do Código

meworks e APIs Java. Muitas vezes, apenas por seguir as regras de uma determinadaAPI, sem saber você já está utilizando um determinado padrão. A �exibilidade queaquele framework consegue para ser instanciado na sua aplicação, muitas vezes éconseguido justamente pelo uso do padrão! O conhecimento de uma situação emque aquele padrão foi utilizado e, muitas vezes sem saber, você acabou o utilizando,também ajuda muito em sua compreensão.

Dessa forma, esse livro também cita diversas classes de APIs padrão da lingua-gem Java e de frameworks amplamente utilizados pela comunidade de desenvolvi-mento. Isso vai permitir que o desenvolvedor possa compreender melhor aquelasolução inteligente utilizada naquele contexto, e trazer a mesma ideia para questõesdo seu próprio código.

Além disso, como o próprio nome do livro diz, os padrões de projeto são apre-sentados na linguagem Java e, dessa forma, acabam trazendo algumas dicas maisespecí�cas da linguagem para sua implementação. Essas dicas vão desde a utilizaçãodos próprios recursos da linguagem, como a utilização de sua biblioteca de classes e,até mesmo, de frameworks externos.

xii

Casa do Código

Lista de Discussão

O design de so�ware é um tema pelo qual me apaixonei justamente por ser algo emque o uso da criatividade é essencial, e cada aplicação tem suas particularidades, oque sempre traz novas questões a serem discutidas. O mesmo ocorre com padrões!Eles já estão aí há muitos anos e até hoje ainda existe muita discussão sobre eles!Sendo assim, eu gostaria que esse livro não fosse apenas uma comunicação de mãoúnica, onde eu escrevo e vocês leem, mas o início de um canal de comunicação parafomentar discussões e conversas sobre padrões e design de so�ware em geral.

Sendo assim, criei uma lista de discussão com o nome "Design Patternsem Java: Projeto orientado a objetos guiado por padrões” no endereç[email protected].

Se você quer discutir, colocar suas dúvidas e saber eventos e novidades nomundodos padrões, deixo aqui o meu convite para a participação no grupo!

xiii

Casa do Código

Prefácio

Por Joseph YoderJá faz cerca de �� anos que oGangof Four escreveu o livro inicial de padrões cha-

mado "Design Patterns: Elements of Reusable Object-Oriented So�ware”. Desdeaquela época, os padrões de projeto se tornaram muito conhecidos e uma parte es-sencial de uma boa modelagem em sistemas orientados a objetos. Adicionalmente,os padrões ganharam uma grande aceitação na comunidade de desenvolvimento deso�ware, o que pode ser observado pela existência de diversas publicações e casosde sucesso. Existem também diversas conferências ao redor do mundo criadas aosmoldes da primeira conferência sobre padrões, a Pattern Languages of Programs(PLoP).

Mesmo nos anos iniciais do Java, é possível observar como os padrões in�uenci-aram a linguagem. Algumas dessas in�uências podem ser vistas claramente nas pri-meiras APIs do Java, como as interfaces Iterator e Observer, enquanto outrasforam implementadas como parte da evolução dessas APIs, como a implementaçãodos listeners, que são uma implementação mais atual do padrão Observer.

Porém, é importante notar que um bom design não acontece por acidente, poisele exige trabalho duro e evolução. De forma complementar, também não quer di-zer que usando um padrão necessariamente se tem um bom design. Por exemplo,a linguagem Java foi lançada apenas alguns anos depois da publicação do primeirolivro de design patterns. Por causa disso, muitas das primeiras bibliotecas da lingua-gem foram in�uenciadas pelo livro e muitos padrões foram incorporados no designde suas principais bibliotecas e frameworks. No entanto, isso nem sempre guiou assoluções para o melhor design e foram necessárias várias evoluções em suas classesdepois que diversos problemas foram encontrados nas primeiras versões.

Um bom exemplo pode ser visto no tratamento de eventos do JavaAWT. No AWT �.�, o tratamento de eventos utilizava o padrão Chain of

Responsibility. A princípio essa parecia uma solução adequada ao olhar para os

xv

Casa do Código

requisitos. O problema com essa implementação era que precisava-se da utilizaçãode um Mediator ou da criação de diversas subclasses. Isso poderia causar pro-blemas de desempenho, visto que para o evento ser tratado era necessário percorrertoda a cadeia para descobrir qual era a classe que deveria processá-lo. Isso muitasvezes direcionava o desenvolvedor a criação de uma soluçãomuito complexa devidoao grande número de subclasses que precisava criar.

A partir disso, o AWT �.� passou a tratar os eventos de forma mais e�ciente uti-lizando os padrões Observer e Adapter. Essa modelagem evoluiu depois paraa utilização de listeners. Essa acabou sendo uma solução muito mais limpa e e�ci-ente, visto que apenas as classes interessadas no evento eram noti�cadas quando eleacontecia. Essa história claramente mostra que o design de um so�ware deve levarem consideração as consequências positivas e negativas de cada decisão, e só porqueele utiliza padrões não quer dizer que aquela é a melhor alternativa de design. Vejaque isso não quer dizer que utilizar padrões leva a decisões erradas de design, masque, pelo contrário, a utilização de um outro padrãomais adequado se mostrou umasolução melhor.

Apenas saber como aplicar os padrões não é o su�ciente para um bom design.Entender quando e onde aplicá-los é tão importante quanto, senão mais importante.De fato, no decorrer do tempo, mesmo um bom design inicial pode ser compro-metido por sucessivas revisões arquiteturais. Em ����, foi feita a a�rmação que aarquitetura que realmente predominava na prática era a Big Ball of Mud (tra-duzindo Grande Bola de Lama). E mesmo com muito trabalho e dedicação aindaé possível acabar com um Big Ball of Mud se você não está comprometido amanter o código sempre limpo.

Existem muitas forças e bons motivos que podem levar a uma arquitetura ex-tremamente complexa. De fato, arquitetos e times de desenvolvimento experientesestão constantemente fazendo exatamente o que deveria ser feito quando se deparamcom “lama” e complexidade desnecessária em seu sistema.

Quando se tenta manter uma arquitetura, é importante tentar proteger certaspartes do design. Grandes sistemas possuem partes que mudam em diferentes velo-cidades. Existem certas ações e padrões que você pode utilizar para isolar e de�nirdivisões em volta dessas diferentes partes, tanto para tornar a arquitetura estável,quanto para possibilitar as mudanças onde elas são necessárias. De fato, essa é umapremissa importante dos padrões de projeto. Isso se torna uma consideração aindamais importante quando evoluímos a estrutura das aplicações para ummundo ondeparte delas está localizada na nuvem.

xvi

Casa do Código

Eu conheço o autor desse livro (Eduardo) a muitos anos. Eduardo tem grandeexperiência em padrões, design orientado a objetos e Java. Eu já colaborei e trabalheicom ele em projetos orientados a objetos e publicações, incluindo a implementaçãode diversos padrões de projeto e a construção de frameworks. Eduardo tem muitaexperiência na construção de frameworks, atividade que exige um conhecimentoprofundo de padrões, além de quando e onde utilizá-los. Ele tem mais do que umacompreensão de “como” implementar umpadrão em Java. Eduardo claramente com-preende o que está em jogo em um bom design orientado a objetos e como utilizaros padrões para um design mais limpo, mais reutilizável e mais fácil de mudar.

Qualquer desenvolvedor para se tornar pro�ciente emumdesign orientado a ob-jetos precisará compreender não apenas o básico sobre padrões, mas também prin-cípios mais avançados a respeito de suas consequências e o contexto em que devemser utilizados. Este livro é mais do que um livro de receitas sobre como aplicar os pa-drões, pois, pelo contrário, ele traz também importantes princípios e se aprofundanessas técnicas avançadas de design. O leitor irá descobrir nesse livro um guia e�ci-ente a respeito de como aplicar os padrões, como escolher o padrão mais adequadoe como saber quando um design deve ser refatorado para a introdução de um novopadrão.

Após ler esse livro, é possível continuar essa jornada sobre o conhecimento depadrões através de conferências sobre o assunto, como o SugarLoafPLoP no Brasil.Este assunto tem se tornado de extrema importância para todas as facetas dos sis-temas de so�ware, principalmente aqueles que estão em constante evolução para semanterem atualizados frente a novos requisitos.

xvii

Casa do Código Sumário

Sumário

� Entendendo Padrões de Projeto ��.� Conceitos da Orientação a Objetos . . . . . . . . . . . . . . . . . . . . ��.� Mas esses conceitos não são su�cientes? . . . . . . . . . . . . . . . . . ��.� O Primeiro Problema: Cálculo do Valor do Estacionamento . . . . . ��.� Strategy: o Primeiro Padrão! . . . . . . . . . . . . . . . . . . . . . . . . ���.� O que são padrões? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Como o Livro Está Organizado . . . . . . . . . . . . . . . . . . . . . . ��

� Reuso Através de Herança ���.� Exemplo de Padrão que Utiliza Herança - Null Object . . . . . . . . . ���.� Hook Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Revisando modi�cadores de métodos . . . . . . . . . . . . . . . . . . . ���.� Passos diferentes na Mesma Ordem - Template Method . . . . . . . . ���.� Refatorando na Direção da Herança . . . . . . . . . . . . . . . . . . . . ���.� Criando Objetos na Subclasse - Factory Method . . . . . . . . . . . . ���.� Considerações Finais do Capítulo . . . . . . . . . . . . . . . . . . . . . ��

� Delegando Comportamento com Composição ���.� Tentando Combinar Opções do Gerador de Arquivos . . . . . . . . . ���.� Bridge - Uma Ponte entre Duas Variabilidades . . . . . . . . . . . . . ���.� Hook Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� State - Variando o Comportamento com o Estado da Classe . . . . . . ���.� Substituindo Condicionais por Polimor�smo . . . . . . . . . . . . . . ���.� Compondo comMúltiplos Objetos - Observer . . . . . . . . . . . . . ���.� Considerações Finais do Capítulo . . . . . . . . . . . . . . . . . . . . . ��

xix

Sumário Casa do Código

� Composição Recursiva ���.� Compondo um Objeto com sua Abstração . . . . . . . . . . . . . . . . ���.� Composite - Quando um Conjunto é um Indivíduo . . . . . . . . . . ���.� Encadeando Execuções com Chain of Responsibility . . . . . . . . . . ���.� Refatorando para Permitir a Execução de Múltiplas Classes . . . . . . ���.� Considerações Finais do Capítulo . . . . . . . . . . . . . . . . . . . . . ��

� Envolvendo Objetos ���.� Proxies e Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Exemplos de Proxies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Extraindo um Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Adaptando Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Considerações Finais do Capítulo . . . . . . . . . . . . . . . . . . . . . ���

� Estratégias de Criação de Objetos ����.� Limitações dos Construtores . . . . . . . . . . . . . . . . . . . . . . . . ����.� Criando Objetos comMétodos Estáticos . . . . . . . . . . . . . . . . . ����.� UmÚnico Objeto da Classe com Singleton . . . . . . . . . . . . . . . ����.� Encapsulando Lógica Complexa de Criação com Builder . . . . . . . ����.� Relacionando Famílias de Objetos com Abstract Factory . . . . . . . ����.� Considerações Finais do Capítulo . . . . . . . . . . . . . . . . . . . . . ���

� Modularidade ����.� Fábrica Dinâmica de Objetos . . . . . . . . . . . . . . . . . . . . . . . . ����.� Injeção de Dependências . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Service Locator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Service Locator versus Dependency Injection . . . . . . . . . . . . . . ����.� Considerações Finais do Capítulo . . . . . . . . . . . . . . . . . . . . . ���

� Adicionando Operações ����.� Classes que Representam Comandos . . . . . . . . . . . . . . . . . . . ����.� Cenários de Aplicação do Command . . . . . . . . . . . . . . . . . . . ����.� Double Dispatch - Me chama, que eu te chamo! . . . . . . . . . . . . . ����.� Padrão Visitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Considerações Finais do Capítulo . . . . . . . . . . . . . . . . . . . . . ���

xx

Casa do Código Sumário

� Gerenciando Muitos Objetos ����.� Criando uma Fachada para suas Classes . . . . . . . . . . . . . . . . . ����.� Separando Código Novo de Código Legado . . . . . . . . . . . . . . . ����.� Mediando a Interação entre Objetos . . . . . . . . . . . . . . . . . . . ����.� Reaproveitando Instâncias com Flyweight . . . . . . . . . . . . . . . . ����.� Considerações Finais do Capítulo . . . . . . . . . . . . . . . . . . . . . ���

�� Indo Além do Básico �����.� Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . �����.� Utilizando Tipos Genéricos com os Padrões . . . . . . . . . . . . . . . �����.� Padrões com Test-driven Development . . . . . . . . . . . . . . . . . . �����.� Posso Aplicar esses Padrões na Arquitetura? . . . . . . . . . . . . . . . �����.� Comunidade de Padrões . . . . . . . . . . . . . . . . . . . . . . . . . . �����.� E agora? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���

Índice Remissivo ���

Bibliogra�a ���Versão: ��.�.��

xxi