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 conhecido Otimização de uma estrutura ou processo Esquema arquitetural que permite reuso e expansibilidade Soluçã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ões Padrões Arquiteturais Padrões de Projeto De Criação/Estruturais/Comportamentais Idiomas Padrões para uma linguagem específica
Padrões Arquiteturais Padrões de alto nível (arquitetura de sistemas) MVC Layered Application Container Model
Padrões de Projeto Padrões a nível de  design Soluções para situações-problema Garantir qualidade à aplicação Flexibilidade Reuso Baixo acoplamento Extensibilidade
Padrões de Projeto Padrõ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 manualmente CarroRenault 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 Racing Solução padronizada: Abstract Factory “ Prover uma interface que permita a criação de objetos relacionados ou dependentes sem especificar sua classe concreta ”
Kiloton Racing Padrão Abstract Factory
Kiloton Racing Fábricas de Carros 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 Projeto Padrõ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++ Sockets Caso: 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 plataforma Dependência de recursos de SO diferenciados
C++ Sockets Soluçã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++ Sockets Solução padronizada: Bridge “ Desacoplar abstrações de suas implementações para que as duas partes possam variar independentemente ”
C++ Sockets Padrão Bridge
C++ Sockets SocketImpl
C++ Sockets Utilizando 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 Projeto Padrõ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: JChat Sabrina 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áfica Uma só classe que cuida da interface e da conexão (socket) com o servidor
JChat Solução ruim 2: criar um processo na classe da interface que fique “ouvindo” por mensagens Processo 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”?
JChat Soluçã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 ”
JChat Padrão Observer
JChat JChatEvents
JChat Utilizando os JChatEvents InterfaceGrafica: implementar a interface Ouvinte e registrar-se como ouvinte da conexão
JChat public 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()
Idiomas Padrões específicos para uma Linguagem de Programação Cursor/Iterator Template Handling (C++)
Anti-Patterns O que são? Tipos de Anti-Patterns Exemplos!
Anti-Patterns Soluções péssimas adotadas em projetos Documentação de más práticas Indicação de como solucionar problemas comuns
Tipos de Anti-Patterns Arquitetura Desenvolvimento Gerência
Anti-Patterns Anti-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-Patterns Anti-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:  U m 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-Patterns Anti-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 Finais O 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 Internet Pattern Digest –  http://patterndigest.com Anti-Patterns Depot –  http://www.antipatterns.com

Padrões De Projeto e Anti Patterns

  • 1.
    Padrões de Projetoe Anti-Patterns Débora Kelly Gouvêia Herval Freire de A. Júnior
  • 2.
    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
  • 3.
    Padrões (Patterns) Soluçãode um problema conhecido Otimização de uma estrutura ou processo Esquema arquitetural que permite reuso e expansibilidade Solução mais indicada para um cenário
  • 4.
    Um pouco dehistó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)
  • 5.
    Tipos de PadrõesPadrões Arquiteturais Padrões de Projeto De Criação/Estruturais/Comportamentais Idiomas Padrões para uma linguagem específica
  • 6.
    Padrões Arquiteturais Padrõesde alto nível (arquitetura de sistemas) MVC Layered Application Container Model
  • 7.
    Padrões de ProjetoPadrões a nível de design Soluções para situações-problema Garantir qualidade à aplicação Flexibilidade Reuso Baixo acoplamento Extensibilidade
  • 8.
    Padrões de ProjetoPadrões de Criação Como instanciar objetos? Modularizar e flexibilizar a criação, composição e representação de objetos.
  • 9.
    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
  • 10.
    Kiloton Racing Problema:instanciação dos carros requer muitos detalhes Solução ruim: instanciar e configurar manualmente CarroRenault 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?
  • 11.
    Kiloton Racing Soluçãopadronizada: Abstract Factory “ Prover uma interface que permita a criação de objetos relacionados ou dependentes sem especificar sua classe concreta ”
  • 12.
    Kiloton Racing PadrãoAbstract Factory
  • 13.
    Kiloton Racing Fábricasde Carros Método fabricaCarro() trata de “fabricar” os detalhes do carro
  • 14.
    Utilizando as Fábricasde Carros Carros de outras montadoras? Basta criar nova subclasse de Carro e de FabricaDeCarro Kiloton Racing CarroRenault carro1 = FabricaRenault.fabricaCarro(); CarroPeugeot carro2 = FabricaPeugeot.fabricaCarro();
  • 15.
    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
  • 16.
    Estudo de caso:C++ Sockets Caso: 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 plataforma Dependência de recursos de SO diferenciados
  • 17.
    C++ Sockets Soluçãoruim: emaranhado de #ifdefs void Socket::accept() { #ifdef SO_WIN32 // Solução para win32 #endif #ifdef SO_UNIX // Solução para unix #endif ... }
  • 18.
    C++ Sockets Soluçãopadronizada: Bridge “ Desacoplar abstrações de suas implementações para que as duas partes possam variar independentemente ”
  • 19.
  • 20.
  • 21.
    C++ Sockets Utilizandoa 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
  • 22.
    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.
  • 23.
    Estudo de caso:JChat Sabrina 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
  • 24.
    JChat Solução ruim1: acoplar o socket à interface gráfica Uma só classe que cuida da interface e da conexão (socket) com o servidor
  • 25.
    JChat Solução ruim2: criar um processo na classe da interface que fique “ouvindo” por mensagens Processo 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”?
  • 26.
    JChat Soluçã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 ”
  • 27.
  • 28.
  • 29.
    JChat Utilizando osJChatEvents InterfaceGrafica: implementar a interface Ouvinte e registrar-se como ouvinte da conexão
  • 30.
    JChat public classInterfaceGrafica implements Ouvinte { public InterfaceGrafica(ConexaoJChat con) { con.adiciona(this); } public void onMensagem(String msg) { textarea.append(“Mensagem: ” + msg); } }
  • 31.
    JChat Utilizando osJChatEvents ConexaoJChat: a cada mensagem recebida, chamar o método notificaOuvintes()
  • 32.
    Idiomas Padrões específicospara uma Linguagem de Programação Cursor/Iterator Template Handling (C++)
  • 33.
    Anti-Patterns O quesão? Tipos de Anti-Patterns Exemplos!
  • 34.
    Anti-Patterns Soluções péssimasadotadas em projetos Documentação de más práticas Indicação de como solucionar problemas comuns
  • 35.
    Tipos de Anti-PatternsArquitetura Desenvolvimento Gerência
  • 36.
    Anti-Patterns Anti-Patterns deArquitetura Problemas comuns nas fases de concepção, projeto e desenho de um sistema
  • 37.
    Anti-Patterns de ArquiteturaIntellectual 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
  • 38.
    Anti-Patterns de ArquiteturaReinventing 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
  • 39.
    Anti-Patterns Anti-Patterns deDesenvolvimento Problemas comuns na codificação e desenvolvimento de aplicações
  • 40.
    Anti-Patterns de DesenvolvimentoGolden 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: U m 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
  • 41.
    Anti-Patterns de DesenvolvimentoThe 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
  • 42.
    Anti-Patterns Anti-Patterns deGerência Problemas que atingem a gerência de pessoal e de projetos
  • 43.
    Anti-Patterns de GerênciaSmoke 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
  • 44.
    Anti-Patterns de GerênciaThe 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
  • 45.
    Considerações Finais Oconhecimento 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
  • 46.
    Referências na InternetPattern Digest – http://patterndigest.com Anti-Patterns Depot – http://www.antipatterns.com