padrões de projeto e anti patterns

Post on 19-Jun-2015

6.940 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Padrões de Projeto e Anti-Patterns

Débora Kelly Gouvêia

Herval Freire de A. Júnior

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

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

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)

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

De Criação/Estruturais/Comportamentais Idiomas

Padrões para uma linguagem específica

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

sistemas) MVC Layered Application Container Model

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

Flexibilidade Reuso Baixo acoplamento Extensibilidade

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

Como instanciar objetos?

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

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

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?

Kiloton RacingSolução padronizada:

Abstract Factory

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

Kiloton RacingPadrão Abstract Factory

SpecificFactory

FactoryMethodX()FactoryMethodY()

SpecificProduct

SpecificProductY

AbstractFactory

FactoryMethodX()FactoryMethodY()

ProductYProductX

Client

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

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();

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

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

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...

}

C++ SocketsSolução padronizada:

Bridge

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

independentemente”

C++ Sockets

Padrão Bridge

RefinedAbstraction ConcreteImplA

operationIm pl()

ConcreteImplB

operationIm pl()

Implementor

operationIm pl()

Abstraction

operation()

operation() { imp.operationImpl()}

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

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

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.

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

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

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”?

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”

JChatPadrão Observer

Subject

add()rem ove()notifyAllObservers()

Observer

update()0..*

+observers

0..*

RealObserver

update()

RealSubject

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)

JChat

Utilizando os JChatEventsInterfaceGrafica: implementar a

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

JChatpublic class InterfaceGrafica implements Ouvinte {

public InterfaceGrafica(ConexaoJChat con) {

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

JChat

Utilizando os JChatEvents ConexaoJChat: a cada mensagem

recebida, chamar o método notificaOuvintes()

IdiomasPadrões específicos para uma

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

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

Anti-PatternsSoluções péssimas adotadas em

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

problemas comuns

Tipos de Anti-Patterns

Arquitetura

Desenvolvimento

Gerência

Anti-PatternsAnti-Patterns de Arquitetura

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

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

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

Anti-PatternsAnti-Patterns de Desenvolvimento

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

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

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

Anti-PatternsAnti-Patterns de Gerência

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

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

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

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

Referências na InternetPattern Digest –

http://patterndigest.com

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

top related