Your SlideShare is downloading. ×
  • Like
Padrões De Projeto e Anti Patterns
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Padrões De Projeto e Anti Patterns

  • 6,798 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
6,798
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
318
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Padrões de Projeto e 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çã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
  • 4. 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)
  • 5. Tipos de Padrões
    • Padrões Arquiteturais
    • Padrões de Projeto
      • De Criação/Estruturais/Comportamentais
    • Idiomas
      • Padrões para uma linguagem específica
  • 6. Padrões Arquiteturais
    • Padrões de alto nível (arquitetura de sistemas)
      • MVC
      • Layered Application
      • Container Model
  • 7. 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
  • 8. 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.
  • 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ção padronizada:
      • Abstract Factory
      • “ Prover uma interface que permita a criação de objetos relacionados ou dependentes sem especificar sua classe concreta ”
  • 12. Kiloton Racing
    • Padrão Abstract Factory
  • 13. Kiloton Racing
    • Fábricas de Carros
    Método fabricaCarro() trata de “fabricar” os detalhes do carro
  • 14.
    • 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();
  • 15. 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
  • 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ção ruim: 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ção padronizada:
      • Bridge
      • “ Desacoplar abstrações de suas implementações para que as duas partes possam variar independentemente ”
  • 19. C++ Sockets
    • Padrão Bridge
  • 20. C++ Sockets
    • SocketImpl
  • 21. 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
  • 22. 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.
  • 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 ruim 1: 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 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”?
  • 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. JChat
    • Padrão Observer
  • 28. JChat
    • JChatEvents
  • 29. JChat
    • Utilizando os JChatEvents
      • InterfaceGrafica: implementar a interface Ouvinte e registrar-se como ouvinte da conexão
  • 30. JChat
      • public class InterfaceGrafica implements Ouvinte {
      • public InterfaceGrafica(ConexaoJChat con) {
        • con.adiciona(this);
        • }
        • public void onMensagem(String msg) {
        • textarea.append(“Mensagem: ” + msg);
        • }
        • }
  • 31. JChat
    • Utilizando os JChatEvents
      • ConexaoJChat: a cada mensagem recebida, chamar o método notificaOuvintes()
  • 32. Idiomas
    • Padrões específicos para uma Linguagem de Programação
      • Cursor/Iterator
      • Template Handling (C++)
  • 33. Anti-Patterns
    • O que são?
    • Tipos de Anti-Patterns
    • Exemplos!
  • 34. Anti-Patterns
    • Soluções péssimas adotadas em projetos
    • Documentação de más práticas
    • Indicação de como solucionar problemas comuns
  • 35. Tipos de Anti-Patterns
    • Arquitetura
    • Desenvolvimento
    • Gerência
  • 36. Anti-Patterns
    • Anti-Patterns de Arquitetura
      • Problemas comuns nas fases de concepção, projeto e desenho de um sistema
  • 37. 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
  • 38. 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
  • 39. Anti-Patterns
    • Anti-Patterns de Desenvolvimento
      • Problemas comuns na codificação e desenvolvimento de aplicações
  • 40. 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
  • 41. 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
  • 42. Anti-Patterns
    • Anti-Patterns de Gerência
      • Problemas que atingem a gerência de pessoal e de projetos
  • 43. 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
  • 44. 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
  • 45. 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
  • 46. Referências na Internet
    • Pattern Digest – http://patterndigest.com
    • Anti-Patterns Depot – http://www.antipatterns.com