View
678
Download
0
Category
Preview:
Citation preview
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
Recommended