design patterns bruno lustosa pereira [email protected] soluções elegantes para problemas...
TRANSCRIPT
Design PatternsBruno Lustosa [email protected]
Soluções elegantes para problemas recorrentes
PHP Conference Brasil2006-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