Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Design Patterns com Java, Manuais, Projetos, Pesquisas de Padrões de Design

Aprenda a programar utilizando a boa prática dos padrões de projetos na linguagem java

Tipologia: Manuais, Projetos, Pesquisas

2020

Compartilhado em 25/08/2020

filmes
filmes 🇧🇷

6 documentos

1 / 274

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Pré-visualização parcial do texto

Baixe Design Patterns com Java e outras Manuais, Projetos, Pesquisas em PDF para Padrões de Design, somente na Docsity!

Agradecimentos Pessoais

Meu primeiro agradecimento é a Deus, por Ele ter me proporcionado tudo para que trilhasse o caminho que trilhei até chegar onde estou agora. Por ter colocado as pes- soas certas para me ajudar em minhas dificuldades, por ter me colocado obstáculos nas 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 que acabaram direcionando minha vida no futuro. Em seguida envio meu “muito obrigado” para meus pais, José Maria e Maria da Graça, que sempre me incentivaram e me apoiaram em minhas escolhas. Mesmo estando distantes fisicamente hoje, sei que todos os dias eles rezam e torcem por mim. Imagino direitinho eles mostrando esse livro para todo mundo com o maior orgulho! Aproveito essa oportunidade para estender esse agradecimento para toda minha familia, em especial para minha Tia Dorinha que sempre esteve do meu lado quando precisei. Agradeço também a Maria Eduarda, a Duda, minha filha mais velha, por trazer só alegria desde que chegou nesse mundo. Seu jeito amigo e carinhoso me conforta sempre que por algum motivo estou para baixo. Não sei como tanta bondade e paci- ência pode caber em apenas uma pessoa. Sou muito grato pelo seu companheirismo, como quando ela senta do meu lado bem agarradinha para assistir um filme ou jogar um video-game. Seguindo para a mais nova da familia, agradeço a Ana Beatriz, a Bia, por con- ter a maior concentração de energia e alegria de todo mundo. Apesar de ser bem bagunceira e gostar de um alvoroço, ela sempre faz alguma coisa que consegue tirar uma gargalhada de nossa boca nas horas mais inesperadas. É até difícil de descrever a 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 fim os agradecimentos para minha companheira de toda vida, mi- nha esposa Roberta, ou, como eu chamo ela, Lindinha. Acho que ela não tem noção

i

Agradecimentos Profissionais

Antes de mencionar alguém de forma específica, gostaria de agradecer a todos meus professores, colegas de trabalho, amigos e companheiros que de alguma forma con- tribuiram para meu conhecimento e me incentivaram a seguir em frente. Nossa vida é feita de pessoas e de experiências, e é a partir disso que seguimos nossos caminhos e 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 fiz meu mestrado e doutorado. Além disso, também foi um local onde tive a oportunidade de atuar como professor por mais de 5 anos. Foram experiências que me marcaram e são uma importante parte da minha 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 foram muito além de questões técnicas. Espero ainda fazermos muitas coisas juntos! Agradeço a revista MundoJ, principalmente ao Marco Guapo, inicialmente por ter aberto espaço para que escrevesse sobre minhas ideias e meus conhecimentose em seguida por ter confiado 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 sempre atualizado 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 afirmar com certeza que a semente 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 influenciado com toda sua cultura e ideias. Sou grato por terem me recebido de braços abertos e por terem fornecido um forum onde foi possível debater as minhas ideias e obter feedback dos trabalhos que estou realizando. Agra-

iii

deço em especial pelo apoio e incentivo de Fabio Kon, Fábio Silveira, Jerffeson Souza, Uirá Kulezsa, Ademar Aguiar e Filipe Correia. Também agradeço pelos meus gurus Joseph Yoder e Rebecca Wirfs-Brock, com quem aprendi demais e tive discussões muito interessantes sobre modelagem e arquitetura de software.

Agradeço ao INPE, instituição onde acabei de ingressar, por ter me recebido de braços abertos e pela confiança que tem depositado em meu trabalho. Espero poder dar muitas contribuições e desenvolver diversos trabalhos interessantes durante os anos que estão por vir!

Finalmente agradeço a Casa do Código pelo convite para escrita desse livro. Ape- sar da vontade sempre ter existido, o convite de vocês foi o estopim para que esse projeto se tornasse algo concreto. Deixo um agradecimento em especial ao editor desse livro, Paulo Silveira, pelos questionamentos e sugestões que contribuiram de forma definitiva para o conteúdo desse livro.

iv

Devido sua sede de conhecimento, ainda nesse período, estudou por conta pró- pria e tirou sete certificações referentes a tecnologia Java, sendo na época um dos profissionais brasileiros com maior número de certificações na área. Além disso, ocupa o cargo de editor-chefe da revista MundoJ desde 2006, na qual já publicou dezenas de artigos técnicos de reconhecida qualidade. Esses fatos lhe deram uma visão da indústria de desenvolvimento de software que foi muito importante em sua trajetó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 simplificaram a criação das aplicações e deram maior produtividade para a equipe de implementação. Um deles, o SwingBean, foi trans- formado em um projeto open-source e já possui mais de 5000 downloads. A grande inovação e diferencial de seus frameworks estava no fato de serem baseados em me- 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çou sua 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 em metadados tem para agilizar o desenvolvimento de software e o tornar mais flexível.

Então, em 2007, ele ingressou no curso de doutorado do ITA pelo Programa de 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 flexíveis, nas quais se pode acrescentar funcionali- dade de forma mais fácil, é algo crítico para aplicações de comando e controle, foco de 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ção de técnicas e práticas, a criação de novos frameworks de código aberto e a execução de experimentos para avaliar os conceitos propostos.

Foi nessa época que Eduardo começou a participar e se envolveu na comunidade de padrões. Em 2008 submeteu para o SugarLoafPLoP em Fortaleza os primeiros padrões que identificou em frameworks que utilizavam metadados. Nesse momento ele se emplogou com o espírito de colaboração da comunidade de padrões, onde recebeu 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 em eventos no Brasil e no exterior. Além disso, em 2011 participou da organização do

vi

MiniPLoP Brasil, em 2012 foi o primeiro brasileiro a ser chair da principal conferên- cia internacional de padrões, o PLoP, e em 2013 está também participando também da 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, onde pô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 trabalhos que, de certa forma, complementavam e exploravam outros aspectos do que estava desenvolvendo 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 de graduação Engenharia da Computação e duas vezes para a turma de especialização em Engenharia de Software. Em 2010, apresentou seu doutorado chamado “A Conceptual Model for Metadata-based Frameworks e concluiu com sucesso essa jornada que deixou di- versas contribuições. Devido a relevância do tema, foi incentivado pelos membros da banca a continuar os estudos que vem realizando nessa área. Apesar da tese ter trazido grandes avanços, ele tem consciência que ainda há muito a ser feito. Uma de suas iniciativas nessa área foi o projeto Esfinge (http://esfinge.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ários artigos científicos em cima de inovações realizadas nesses projetos. No mesmo ano que terminou seu doutorado, veio sua segunda filhinha, a Ana Beatriz.

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

vii

Porque mais um livro de padrões?

O primeiro livro de padrões “Design Patterns: Elements of Reusable Object- Oriented Software”, conhecido como Gang of Four (GoF), já foi lançado a mais de 15 anos e de forma alguma seu conteúdo está ultrapassado. Em minha opinião, esse livro foi algo muito a frente de seu tempo, sendo que muitas de suas práticas só foram ser utilizadas de forma efetiva pela indústria alguns anos depois. Durante esses anos, diversos livros sobre esses padrões foram escritos, apresentando sua implementação em 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 fizerem ter diferentes visões sobre os padrões. Dentre essas experiências eu posso citar o ensino de modelagem de software e padrões, a utilização de padrões para o desenvolvimento de frameworks e aplicações, a identificação de novos padrões a partir do estudo de implementaçõ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 diferenciada sobre esses padrões, e é essa visão que procuro passar nesse livro. As seções a seguir descrevem 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 ou empresas de treinamento, vão ensinando os padrões um por um. Mas qual é a melhor ordem para o ensino e a assimilação dos padrões? Isso era algo que era decidido por cada professor. Uma ordem inadequada nesse aprendizado pode impedir que o aluno não compreenda os princípios por trás da solução do padrão, o que dificulta sua compreenção a respeito de sua aplicabilidade e suas consequências. Isso também pode causar uma visão limitada da solução do padrão, o que impede sua adaptação para outros contextos similares.

ix

Esse livro procura organizar os padrões em uma sequência didática para o apren- dizado. Cada capítulo agrupa os padrões pelo tipo de técnica que utilizam em sua solução ou pelo tipo de problema que resolvem. Dessa forma, ao ver uma mesma té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 focam em 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 e quais 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 verdade a 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 ou programação orientada a objetos avançada.

Relação entre Padrões

Outro problema que percebo é que os padrões tendem a ser olhados de forma individual. Isso é uma consequência do formato que os padrões possuem e do fato de serem auto-contidos, ou seja, toda informação sobre o padrão estar contida em sua descrição. Isso por um lado é bom pois permite que alguém obtenha todas as informações sobre um determinado padrão em apenas um local. Porém, por outro lado, 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ção pequena 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 com os padrões anteriores ou como eles podem ser utilizados como uma alternativa a um outro padrão. Esse tipo de discussão é importante, pois além de saber a solução do padrão, também é essencial saber quando aplica-la.

Refatoração para Padrões

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

x

meworks e APIs Java. Muitas vezes, apenas por seguir as regras de uma determi- nada API, sem saber você já utilizando um determinado padrão. A flexibilidade que aquele framework consegue para ser instanciado na sua aplicação, muitas vezes é conseguido justamente pelo uso do padrão! O conhecimento de uma situação em que aquele padrão foi utilizada e, muitas vezes sem saber, você acabou o utilizando, também ajuda muito em sua compreençã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 aquela solução inteligente utilizada naquele contexto, e trazer a mesma ideia para questões do 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 mais es- pecíficas da linguagemj para sua implementação. Essas dicas vão desde a utilização dos próprios recursos da linguagem, como a utilização de sua biblioteca de classes e, até mesmo, de frameworks externos.

xii

Lista de Discussão

O design de software é um tema pelo qual me apaixonei justamente por ser algo em que o uso da criatividade é essancial, e cada apli cação tem suas particularidades, o que sempre traz novas questões a serem discutidas. O mesmo ocorre com padrões! Eles já estão aí a 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 para fo- mentar discussões e conversas sobre padrões e design de software em geral.

Sendo assim, criei uma lista de discussão com o nome "Design Patterns em Java: Projeto orientado a objetos guiado por padrões” no endereço [email protected]. Se você quer discutir, colocar suas dúvidas e saber eventos e novidades no mundo dos padrões, deixo aqui o meu convite para a participação no grupo!

xiii

Prefácio

Por Joseph Yoder Já fazem cerca de 20 anos que o Gang of Four escreveu o livro inicial de pa- drões chamado "Design Patterns: Elements of Reusable Object-Oriented Soft- ware”. Desde aquela época, os padrões de projeto se tornaram muito conhecidos e uma parte essencial de uma boa modelagem em sistemas orientados a objetos. Adi- cionalmente, os padrões ganharam uma grande aceitação na comunidade de desen- volvimento de software, o que pode ser observado pela existência de diversas publi- cações e casos de sucesso. Existem também diversas conferências ao redor do mundo criadas aos moldes 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 influenci- aram a linguagem. Algumas dessas influências podem ser vistas claramente nas pri- meiras APIs do Java, como as interfaces Iterator e Observer, enquanto outras foram implementadas como parte da evolução dessas APIs, como a implementação dos 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, pois ele 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 primeiro livro de design patterns. Por causa disso, muitas das primeiras bibliotecas da lingua- gem foram influenciadas pelo livro e muitos padrões foram incorporados no design de suas principais bibliotecas e frameworks. No entanto, isso nem sempre guiou as soluções para o melhor design e foram necessárias várias evoluções em suas classes depois que diversos problemas foram encontrados nas primeiras versões. Um bom exemplo pode ser visto no tratamento de eventos do Java AWT. No AWT 1.0, 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

requisitos. O problema com essa implementação era que precisava-se da utilização de 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 percorrer toda a cadeia para descobrir qual era a classe que deveria processa-lo. Isso muitas vezes direcionava o desenvolvedor a criação de uma solução muito complexa devido ao grande número de subclasses que precisava criar.

A partir disso, o AWT 1.1 passou a tratar os eventos de forma mais eficente uti- lizando os padrões Observer e Adapter. Essa modelagem evoluiu depois para a utilização de listeners. Essa acabou sendo uma solução muito mais limpa e efici- ente, visto que apenas as classes interessadas no evento eram notificadas quando ele acontecia. Essa história claramente mostra que o design de um software deve levar em consideração as consequências positivas e negativas de cada decisão, e só porque ele utiliza padrões não quer dizer que aquela é a melhor alternativa de design. Veja que isso não quer dizer que utilizar padrões leva a decisões erradas de design, mas que, pelo contrário, a utilização de um outro padrão mais adequado se mostrou uma solução melhor.

Apenas saber como aplicar os padrões não é o suficiente para um bom design. Entender quando e onde aplica-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 1998, foi feita a afirmação que a arquitetura 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 a manter 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 experientes estão constantemente fazendo exatamente o que deveria ser feito quando se deparam com “lama” e complexidade desnecessária em seu sistema.

Quando se tenta manter uma arquitetura, é importante tentar proteger certas partes do design. Grandes sistemas possuem partes mudam em diferentes veloci- dades. Existem certas ações e padrões que você pode utilizar para isolar e definir divisõ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 é uma premissa importante dos padrões de projeto. Isso se torna uma consideração ainda mais importante quando evoluimos a estrutura das aplicações para um mundo onde parte delas está localizada na nuvem.

xvi

Casa do Código Sumário

  • 1 Entendendo Padrões de Projeto Sumário
    • 1.1 Conceitos da Orientação a Objetos
    • 1.2 Mas esses conceitos não são suficientes?
    • 1.3 O Primeiro Problema: Cálculo do Valor do Estacionamento
    • 1.4 Strategy: o Primeiro Padrão!
    • 1.5 O que são padrões?
    • 1.6 Como o Livro Está Organizado
  • 2 Reuso Através de Herança
    • 2.1 Exemplo de Padrão que Utiliza Herança - Null Object
    • 2.2 Hook Methods
    • 2.3 Revisando modificadores de métodos
    • 2.4 Passos diferentes na Mesma Ordem - Template Method
    • 2.5 Refatorando na Direção da Herança
    • 2.6 Criando Objetos na Subclasse - Factory Method
    • 2.7 Considerações Finais do Capítulo
  • 3 Delegando Comportamento com Composição
    • 3.1 Tentando Combinar Opções do Gerador de Arquivos
    • 3.2 Bridge - Uma Ponte entre Duas Variabilidades
    • 3.3 Hook Classes
    • 3.4 State - Variando o Comportamento com o Estado da Classe
    • 3.5 Substituindo Condicionais por Polimorfismo
    • 3.6 Compondo com Múltiplos Objetos - Observer
    • 3.7 Considerações Finais do Capítulo