Soluções elegantes para problemas recorrentes Design Patterns Bruno Lustosa Pereira bruno@lustosa.net Soluções elegantes para problemas recorrentes PHP Conference Brasil 2006-12-01 - São Paulo
Design Patterns O que são esses padrões? Estruturas recorrentes encontradas no processo de desenvolvimento de softwares orientados a objeto. Modelos de soluções reutilizáveis para problemas encontrados diariamente. Não é re-uso de código, e sim de idéias e estratégias de desenvolvimento. 1 / 21
Design Patterns GoF - Gang of Four O primeiro livro sobre o assunto. A comunidade se refere aos 4 autores como a "Gangue dos Quatro". 2 / 21
Design Patterns Tipos de Padrões Criação: Principal função é lidar com os mecanismos de criação de objetos. Exemplos: Factory, Singleton e Registry. Estruturais: Simplificam a realização de relacionamentos entre diferentes classes. Exemplos: Facade, Adapter e Decorator. Comportamentais: Preocupam-se com a atribuição de responsabilidades entre objetos. Exemplos: Observer, Strategy. 3 / 21
Design Patterns Prós e Contras Prós: Facilitam o re-uso de técnicas e arquiteturas de software já testadas com sucesso. Define um padrão de comunicação compartilhado pela equipe de desenvolvimento. Contras: Precisa ser reprogramado em cada aplicação. Uso indiscriminado pode aumentar muito a complexidade. 4 / 21
Design Patterns Factory (fábrica) Problema: Como encapsular o processo de criação de objetos complexos? Exemplos: Objetos onde é necessário escolher qual subclasse instanciar, onde é necessário buscar suas configurações iniciais, ou onde se precisa criar objetos auxiliares como parte do processo de criação. 5 / 21
Design Patterns Diagrama UML do Factory Método factory() da Fábrica retorna instâncias de Produto. 6 / 21
Design Patterns Singleton Problema: Como garantir que uma classe só possua uma única instância, e que essa instância seja acessível globalmente? Exemplos: Conexão com BD, escrita em arquivo, spool de impressão, outros padrões como o Registro. 7 / 21
Design Patterns Diagrama UML do Singleton Método instance() retorna a instância do singleton. Construtor private. Propriedade instance guarda referência à instância. 8 / 21
Design Patterns Registry (registro) Problema: Como criar um "catálogo" de objetos, de onde se possa conseguir referências a eles através de uma interface conhecida? Exemplo: Site com conexões para múltiplos BDs. As conexões ficam no registro, facilitando as consultas em qualquer ponto do código. 9 / 21
Design Patterns Diagrama UML do Registry Método instance() retorna a instância do registro. Construtor private. store é um array que guarda as referências dos objetos. set() guarda referências e get() as recupera. 10 / 21
Design Patterns Facade (fachada) Problema: Como simplificar a interface de um sistema ou classe complexos, criando uma “fachada” mais amigável? Exemplos: Um gateway de pagamento, que serve de interface com bancos e administradoras de cartões. 11 / 21
Design Patterns Diagrama UML do Facade Facade é a classe que provê uma interface simples para um subsistema complexo. 12 / 21
Design Patterns Adapter (adaptador) Problema: Como fazer com que duas classes com interfaces incompatíveis possam se falar? Exemplos: Uma classe que só funciona com determinada versão de outra. Um adaptador poderia ser usado para fazer com que essa classe funcionasse com outras versões. 13 / 21
Design Patterns Diagrama UML do Adaptador Cliente fala com Compatível. Adaptador faz com que Cliente fale com Incompatível. 14 / 21
Design Patterns Decorator (decorador) Problema: Como adicionar funcionalidade a uma classe dinamicamente, sem precisar usar herança? Exemplos: Um objeto "janela", que pode possuir diversas funcionalidades opcionais, como bordas, barra de rolagem, menu, etc. Usando herança, chegaríamos a uma explosão de subclasses, inviabilizando a manutenção. 15 / 21
Design Patterns Diagrama UML do Decorator 16 / 21
Design Patterns Observer (observador) Problema: Como alertar objetos de que houve uma mudança de estado em um objeto de forma automática? Exemplos: Campos em uma aplicação PHP-GTK, outros casos onde exista uma interdependência entre objetos (uma ação precisa ser tomada por um objeto A caso o estado do objeto B seja alterado). 17 / 21
Design Patterns Diagrama UML do Observer Objeto observável alerta com uma chamada a notify(), que executa update() em cada observador. 18 / 21
Design Patterns Strategy (estratégia) Problema: Como alterar a implementação interna de um objeto dinamicamente? Exemplos: Classes onde se tenham muitos comandos switch. Qualquer problema onde se tenha que tomar uma ação diferente dependendo de algum tipo ou valor. 19 / 21
Design Patterns Diagrama UML do Strategy Classe Ordenacao pode usar qualquer uma das estratégias, chamando o método ordena(). 20 / 21
Design Patterns Mais informações http://www.lustosa.net/ - Site pessoal, com os slides e a implementação em PHP dos padrões apresentados. http://www.phppatterns.com/ - Excelente site sobre design patterns em PHP. 21 / 21