padrões de projeto e anti patterns

46
Padrões de Projeto e Anti-Patterns Débora Kelly Gouvêia Herval Freire de A. Júnior

Upload: herval-freire

Post on 19-Jun-2015

6.939 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Padrões De Projeto e Anti Patterns

Padrões de Projeto e Anti-Patterns

Débora Kelly Gouvêia

Herval Freire de A. Júnior

Page 2: Padrões De Projeto e Anti Patterns

Introdução

Padrões – situações comuns catalogadas e esquematizadas

Conceito comum na engenharia civil e na arquitetura

Formam um jargão que permite a descrição mais completa de um sistema arquitetônico

Garantem qualidade e reusabilidade

Page 3: Padrões De Projeto e Anti Patterns

Padrões (Patterns)Solução de um problema conhecidoOtimização de uma estrutura ou

processoEsquema arquitetural que permite reuso

e expansibilidadeSolução mais indicada para um cenário

Page 4: Padrões De Projeto e Anti Patterns

Um pouco de história... Inspiração: Christopher Alexander (Padrões

de Arquitetura)

Anos 80 – Ward Cunningham e Kent Beck (Padrões para SmallTalk), Jim Coplien (Idiomas para C++)

1994 – Lançamento do livro da Gang-of-Four (Gamma, Helm, Johnson e Vlissides)

Page 5: Padrões De Projeto e Anti Patterns

Tipos de PadrõesPadrões ArquiteturaisPadrões de Projeto

De Criação/Estruturais/Comportamentais Idiomas

Padrões para uma linguagem específica

Page 6: Padrões De Projeto e Anti Patterns

Padrões ArquiteturaisPadrões de alto nível (arquitetura de

sistemas) MVC Layered Application Container Model

Page 7: Padrões De Projeto e Anti Patterns

Padrões de ProjetoPadrões a nível de designSoluções para situações-problemaGarantir qualidade à aplicação

Flexibilidade Reuso Baixo acoplamento Extensibilidade

Page 8: Padrões De Projeto e Anti Patterns

Padrões de ProjetoPadrões de Criação

Como instanciar objetos?

Modularizar e flexibilizar a criação, composição e representação de objetos.

Page 9: Padrões De Projeto e Anti Patterns

Estudo de caso: Kiloton Racing

Caso: A Kiloton Associates precisa desenvolver um jogo de corrida de carros Vários tipos de carros de corrida: motores,

chassis e pneus diferenciados Carros de duas marcas - Renault e

Peugeot, com estruturas diferentes

Page 10: Padrões De Projeto e Anti Patterns

Kiloton Racing

Problema: instanciação dos carros requer muitos detalhes Solução ruim: instanciar e configurar

manualmenteCarroRenault carro = new CarroRenault();carro.setChassis(new ChassisRenault());carro.setMotor(new MotorFrances());carro.setPneus(new PneusFirestone());

CarroPeugeot carro = new CarroPeugeot();carro.setChassis(new ChassisPeugeot());carro.setMotor(new MotorAlemao());carro.setPneus(new PneusBridgestone());

E se tivermos que produzir carros Ford ou Chevrolet?

Page 11: Padrões De Projeto e Anti Patterns

Kiloton RacingSolução padronizada:

Abstract Factory

“Prover uma interface que permita a criação de objetos relacionados ou dependentes sem especificar sua classe concreta”

Page 12: Padrões De Projeto e Anti Patterns

Kiloton RacingPadrão Abstract Factory

SpecificFactory

FactoryMethodX()FactoryMethodY()

SpecificProduct

SpecificProductY

AbstractFactory

FactoryMethodX()FactoryMethodY()

ProductYProductX

Client

Page 13: Padrões De Projeto e Anti Patterns

Kiloton RacingFábricas de Carros

Carro

chassimotorpneusdescricao

<<product>>

FabricaDeCarros

fabricaCarro()

<<abstract factory>>

FabricaRenault

fabricaCarro()

<<concrete factory>>

CarroRenault

FabricaPeugeot

fabricaCarro()

<<concrete factory>>

CarroPeugeot

Método fabricaCarro() trata de “fabricar” os detalhes do carro

Page 14: Padrões De Projeto e Anti Patterns

Utilizando as Fábricas de Carros

Carros de outras montadoras? Basta criar nova subclasse de Carro e de

FabricaDeCarro

Kiloton Racing

CarroRenault carro1 = FabricaRenault.fabricaCarro();

CarroPeugeot carro2 = FabricaPeugeot.fabricaCarro();

Page 15: Padrões De Projeto e Anti Patterns

Padrões de ProjetoPadrões Estruturais

Como compor objetos?Como definir estruturas funcionais?

Lidar com adaptação e interfaceamento entre componentes de uma estrutura maior

Page 16: Padrões De Projeto e Anti Patterns

Estudo de caso: C++ SocketsCaso: Leônidas precisa criar

classes de manipulação de sockets em C++ que possam ser utilizadas em Linux, Unix, Windows, MacOS, OS/2, PalmOS, Calculadoras...API igual para qualquer plataformaDependência de recursos de SO

diferenciados

Page 17: Padrões De Projeto e Anti Patterns

C++ SocketsSolução ruim: emaranhado de #ifdefs

void Socket::accept() { #ifdef SO_WIN32

// Solução para win32 #endif

#ifdef SO_UNIX// Solução para unix

#endif...

}

Page 18: Padrões De Projeto e Anti Patterns

C++ SocketsSolução padronizada:

Bridge

“Desacoplar abstrações de suas implementações para que as duas partes possam variar

independentemente”

Page 19: Padrões De Projeto e Anti Patterns

C++ Sockets

Padrão Bridge

RefinedAbstraction ConcreteImplA

operationIm pl()

ConcreteImplB

operationIm pl()

Implementor

operationIm pl()

Abstraction

operation()

operation() { imp.operationImpl()}

Page 20: Padrões De Projeto e Anti Patterns

C++ Sockets

SocketImpl

SocketWin32

acceptIm pl()sendImpl()receiveIm pl()

SocketMacOS

acceptImpl()sendImpl()receiveImpl()

SocketImpl

acceptIm pl()sendImpl()receiveIm pl()

Socket

accept()send()receive()

accept() { impl.acceptImpl()}

+impl

Page 21: Padrões De Projeto e Anti Patterns

C++ SocketsUtilizando a SocketImpl

Em Windows:Socket sock = new Socket(new SocketWin32());

Em Linux:Socket sock2 = new Socket(new SocketLinux());

Novos S.O.s: implemente uma SocketImpl específica

Page 22: Padrões De Projeto e Anti Patterns

Padrões de ProjetoPadrões comportamentais

Como lidar com comportamento dos objetos?

Permitir interações dinâmicas entre grupos de classes e objetos, de forma a facilitar o entendimento fluxos de dados complexos.

Page 23: Padrões De Projeto e Anti Patterns

Estudo de caso: JChatSabrina está implementando um chat e

precisa de uma interface que fique “ouvindo” mensagens chegando por um socket e exiba-as em uma caixa de texto

Page 24: Padrões De Projeto e Anti Patterns

JChat

Solução ruim 1: acoplar o socket à interface gráficaUma só classe que cuida da interface

e da conexão (socket) com o servidor

Page 25: Padrões De Projeto e Anti Patterns

JChatSolução ruim 2: criar um processo na

classe da interface que fique “ouvindo” por mensagensProcesso em loop infinito dentro da

classe de interface ouvindo por mensagens

E se precisarmos tratar as mensagens?Como fazer manutenção facilmente em

um “objeto-faz-tudo”?

Page 26: Padrões De Projeto e Anti Patterns

JChatSolução padronizada:

Observer

“Definir um relacionamento um-para-muitos entre objetos, de forma que todos os objetos dependentes são

notificados e atualizados automaticamente quando o estado

do objeto observado mudar”

Page 27: Padrões De Projeto e Anti Patterns

JChatPadrão Observer

Subject

add()rem ove()notifyAllObservers()

Observer

update()0..*

+observers

0..*

RealObserver

update()

RealSubject

Page 28: Padrões De Projeto e Anti Patterns

JChatJChatEvents

Ouvinte

onMensagem (String mensagem)

ReceptorMensagem

adiciona(Ouvinte o)rem ove(Ouvinte o)notificaOuvintes()

0..*0..*

ConexaoJChat

conectar()tratarMensagem Recebida()enviarMensagem()

InterfaceGrafica

onMensagem (String mensagem)

Page 29: Padrões De Projeto e Anti Patterns

JChat

Utilizando os JChatEventsInterfaceGrafica: implementar a

interface Ouvinte e registrar-se como ouvinte da conexão

Page 30: Padrões De Projeto e Anti Patterns

JChatpublic class InterfaceGrafica implements Ouvinte {

public InterfaceGrafica(ConexaoJChat con) {

con.adiciona(this); } public void onMensagem(String msg) { textarea.append(“Mensagem: ” + msg); }}

Page 31: Padrões De Projeto e Anti Patterns

JChat

Utilizando os JChatEvents ConexaoJChat: a cada mensagem

recebida, chamar o método notificaOuvintes()

Page 32: Padrões De Projeto e Anti Patterns

IdiomasPadrões específicos para uma

Linguagem de Programação Cursor/Iterator Template Handling (C++)

Page 33: Padrões De Projeto e Anti Patterns

Anti-PatternsO que são?Tipos de Anti-PatternsExemplos!

Page 34: Padrões De Projeto e Anti Patterns

Anti-PatternsSoluções péssimas adotadas em

projetosDocumentação de más práticas Indicação de como solucionar

problemas comuns

Page 35: Padrões De Projeto e Anti Patterns

Tipos de Anti-Patterns

Arquitetura

Desenvolvimento

Gerência

Page 36: Padrões De Projeto e Anti Patterns

Anti-PatternsAnti-Patterns de Arquitetura

Problemas comuns nas fases de concepção, projeto e desenho de um sistema

Page 37: Padrões De Projeto e Anti Patterns

Anti-Patterns de Arquitetura Intellectual Violence

Falas Típicas: “Utilizei um schema validator para poder validar se era

possivel o marshalling daquele stub”

“Esta classe trabalha com o conceito de autômato-finito de três estados para fazer a busca em back-tracking em uma árvore binária”

Resumo: Membros da equipe utilizam-se de teorias e termos desconhecidos pelos demais

Solução: estimular a difusão de conhecimentos dentro da equipe

Page 38: Padrões De Projeto e Anti Patterns

Anti-Patterns de Arquitetura Reinventing the Wheel

Falas Típicas:“Escrevemos uma classe para manipular XML melhor do que as classes oficiais do C++!”

“A ferramenta de UML era muito ruim, por isso decidimos implementar uma outra...”

Resumo: Decisão de reimplementar tecnologias já existentes ou fazer “ao jeito da equipe” atrasam e confundem o projeto

Solução: Pesquisa em busca da melhor solução e utilização de padrões

Page 39: Padrões De Projeto e Anti Patterns

Anti-PatternsAnti-Patterns de Desenvolvimento

Problemas comuns na codificação e desenvolvimento de aplicações

Page 40: Padrões De Projeto e Anti Patterns

Anti-Patterns de Desenvolvimento Golden Hammer

Falas Típicas: “Utilizamos XML para representar os objetos. E também para servir como banco de dados, troca de mensagens, armazenar imagens codificadas, substituir as páginas html, e também para...”

Resumo: Um conceito ou tecnologia familiar é aplicado de forma errada, para resolver todo e qualquer problema.

Solução: Estudo de novas idéias e soluções, treinamento e exposição a novos paradigmas permite pensar em soluções mais adequadas

Page 41: Padrões De Projeto e Anti Patterns

Anti-Patterns de Desenvolvimento The Blob

Falas típicas: “Para manipular qualquer tipo de documento, utilizamos a classe UtilidadesDocumento. Os 145 métodos dela permitem ler e salvar documentos .doc, .xls, .txt, .rtf, .html, .xml... Uma beleza!”

Resumo: Classes são implementadas ao estilo procedural, algumas com centenas de métodos e outras apenas como depósitos de dados.

Solução: Redistribuição de responsabilidades e reengenharia

Page 42: Padrões De Projeto e Anti Patterns

Anti-PatternsAnti-Patterns de Gerência

Problemas que atingem a gerência de pessoal e de projetos

Page 43: Padrões De Projeto e Anti Patterns

Anti-Patterns de Gerência Smoke and Mirrors

Falas Típicas:“Como assim ‘protótipo de interface’?” (cliente confuso)“Mas as telas já estão prontas, por que o programa não está funcionando ainda??” (cliente enfurecido)

Resumo: Usuário final assume que uma demonstração já pode ser utilizada como produto final

Solução: É importante situar o usuário quanto ao processo de desenvolvimento e suas fases

Page 44: Padrões De Projeto e Anti Patterns

Anti-Patterns de Gerência The Feud

Falas Típicas:“João, seu incompetente!”

“A equipe de Recife é muito melhor do que esta aqui”

Resumo: Brigas entre a gerência e membros da equipe causam mal-estar e diminuem a produtividade geral

Solução: conflitos devem ser solucionados o mais rápido possível, se possível com confraternizações

Page 45: Padrões De Projeto e Anti Patterns

Considerações FinaisO conhecimento de padrões e contra-

padrões permite decidir o que deve ser feito e o que deve ser evitado

Sistemas baseados em padrões têm mais qualidade

Equipes que evitam contra-padrões têm menos surpresas desagradáveis

Page 46: Padrões De Projeto e Anti Patterns

Referências na InternetPattern Digest –

http://patterndigest.com

Anti-Patterns Depot – http://www.antipatterns.com