design patterns bruno lustosa pereira [email protected] soluções elegantes para problemas...

22
Design Patterns Bruno Lustosa Pereira [email protected] t Soluções elegantes para problemas recorrentes PHP Conference Brasil 2006-12-01 - São Paulo

Upload: internet

Post on 16-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Design Patterns Bruno Lustosa Pereira bruno@lustosa.net Soluções elegantes para problemas recorrentes PHP Conference Brasil 2006-12-01 - São Paulo

Design PatternsBruno Lustosa [email protected]

Soluções elegantes para problemas recorrentes

PHP Conference Brasil2006-12-01 - São Paulo

Page 2: 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

Page 3: 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

GoF - Gang of Four

● O primeiro livro sobre o assunto.

● A comunidade se refere aos 4 autores como a "Gangue dos Quatro".

2 / 21

Page 4: 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

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

Page 5: 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

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

Page 6: 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

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

Page 7: 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

Diagrama UML do Factory

● Método factory() da Fábrica retorna instâncias de Produto.

6 / 21

Page 8: 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

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

Page 9: 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

Diagrama UML do Singleton

● Método instance() retorna a instância do singleton.

● Construtor private.● Propriedade instance guarda

referência à instância.

8 / 21

Page 10: 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

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

Page 11: 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

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

Page 12: 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

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

Page 13: 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

Diagrama UML do Facade

● Facade é a classe que provê uma interface simples para um subsistema complexo.

12 / 21

Page 14: 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

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

Page 15: 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

Diagrama UML do Adaptador

● Cliente fala com Compatível. Adaptador faz com que Cliente fale com Incompatível.

14 / 21

Page 16: 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

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

Page 17: 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

Diagrama UML do Decorator

16 / 21

Page 18: 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

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

Page 19: 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

Diagrama UML do Observer

● Objeto observável alerta com uma chamada a notify(), que executa update() em cada observador.

18 / 21

Page 20: 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

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

Page 21: 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

Diagrama UML do Strategy

● Classe Ordenacao pode usar qualquer uma das estratégias, chamando o método ordena().

20 / 21

Page 22: 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

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