Flávio Lisboa – PHP Conference 2010
Padrões de Projeto e Boas Práticas em PHP
Flávio Gomes da Silva Lisboa
@fgsl
www.fgsl....
Flávio Lisboa – PHP Conference 2010
Quem sou eu
2007
2008 2009
@fgsl@fgsl
A reprodução é livre, apenas cite a fonte
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
Qual nosso objetivo?
@fgsl
toddler-gift.blog...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
Qual nosso objetivo?
@fgsl
disneypedia.com.br
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
Padrão de Projeto
@fgsl
ci-columbia.com.br
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
Cada padrão
descreve um
problema que
ocorre
...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
Cada
padrão
descreve o
núcleo da
solução
par...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
… de
forma tal
que você
pode usar
essa
soluç...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
… sem
nunca
fazê-la da
mesma
forma
duas
veze...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
O QUE UM PADRÃO DE PROJETO É
SOLUÇÕES REUTIL...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
● A solução para todos os problemas de
proje...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
Padrão de projeto tem
a ver com
arquitetura ...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
Referência: Gangue dos Quatro
@fgsl
http://e...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
Ralph Johnson, Erich Gamma,Richard Helm e Jo...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl
Eles descrevem 23 padrões de projeto e...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Padrões de Criação
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Abstract Factory &
Factory Method...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que servem?
Para criar objet...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que servem?
Para desacoplar ...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que servem?
Quando você não ...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Qual a diferença entre os dois?
A...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Exemplo: conexão com banco de dad...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
if ($database == MYSQL)
{
...
}
i...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Cubrid
dBase
DB++
FrontBase
fileP...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
É possível adotar uma interface ú...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Com uma camada de abstração, uma ...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Singleton
marketingassassin.wordp...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que serve?
Para garantir que...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como implementar?
Primeiro, torne...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como implementar?
class Singleton...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como implementar?
$singleton = Si...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Padrões Estruturais
portoalegre.o...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Adapter
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que serve?
Para proteger sua...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Vantagens
Adapter desloca a manut...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Esquema geral
Aplicação
Adapter
A...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Dica
facilita a criação de adapta...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Decorator
boards.nbc.com
rumahcon...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que serve?
Para estruturar s...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como funciona?
Um objeto incorpor...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como funciona?
http://www.marveld...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como funciona?
figurerealm.com
th...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como funciona?
outskirtsbattledom...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Herança Múltipla
PHP não suporta ...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Mudança de Comportamento
Decorato...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Implementação
Você pode manter um...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Implementação
A classe “decorada”...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Implementação
class Decorated
{
c...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Implementação
Outra forma de usar...
Flávio Lisboa – PHP Conference 2010
'
A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Implementação
class Decorated i...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Proxy
fundamig.org.br
seriesecia-...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que serve?
Para prover acess...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para domar o programador
caozen.b...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como funciona?
class ProxySubject...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Padrões Comportamentais
filipesoa...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Chain of Responsability
Spiderman...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que serve?
Para evitar o aco...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Estudo de Caso
Tratamento de
requ...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Observer
pt.dreamstime.com
bakash...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que serve?
Para alertar muit...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como funciona?
Um objeto Observáv...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Strategy
enciclopedia.com.pt
ndr....
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que serve?
Para alterar faci...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Exemplo: algoritmos genéticos
Um ...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
class GeneticAlgorithm
{
protecte...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Iterator
miniempresaflordelotus.b...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para que serve?
Para manipular fa...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Exemplo: iterando sobre resultado...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Boas Práticas
1)Teste seu código
...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Boas Práticas
4)Refatore o código...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Boas Práticas
7)Documente o códig...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Boas Práticas
9)Use um ambiente d...
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Sugestões
Flávio Lisboa – PHP Conference 2010
Obrigado!
A reprodução é livre, apenas cite a fonte
@fgsl
www.fgsl.eti.br
Little Einst...
Próximos SlideShares
Carregando em…5
×

Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010

5.582 visualizações

Publicada em

Apresentação feita na 5ª PHP Conference Brasil

Publicada em: Tecnologia, Esportes
1 comentário
9 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
5.582
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
168
Comentários
1
Gostaram
9
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010

  1. 1. Flávio Lisboa – PHP Conference 2010 Padrões de Projeto e Boas Práticas em PHP Flávio Gomes da Silva Lisboa @fgsl www.fgsl.eti.br @fgsl A reprodução é livre, apenas cite a fonte
  2. 2. Flávio Lisboa – PHP Conference 2010 Quem sou eu 2007 2008 2009 @fgsl@fgsl A reprodução é livre, apenas cite a fonte
  3. 3. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte Qual nosso objetivo? @fgsl toddler-gift.blogspot.com ondecomprar.net
  4. 4. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte Qual nosso objetivo? @fgsl disneypedia.com.br
  5. 5. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte Padrão de Projeto @fgsl ci-columbia.com.br
  6. 6. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte Cada padrão descreve um problema que ocorre repetidamente em nosso ambiente... @fgsl Naruto,byMasashiKishimoto
  7. 7. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte Cada padrão descreve o núcleo da solução para esse problema... @fgsl atomosybits.com Arquimedes de Siracusa
  8. 8. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte … de forma tal que você pode usar essa solução milhões de vezes... @fgsl bracreditesequiser.blogspot.com
  9. 9. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte … sem nunca fazê-la da mesma forma duas vezes. * Christopher Alexander @fgsl enologia.org.br
  10. 10. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte O QUE UM PADRÃO DE PROJETO É SOLUÇÕES REUTILIZÁVEIS ● Um modelo de solução comprovada ● Uma linguagem comum para desenvolvedores ● Útil para compreender frameworks @fgsl
  11. 11. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte ● A solução para todos os problemas de projeto ● Implementações finais ● Panacéia O QUE UM PADRÃO DE PROJETO NÃO É @fgsl helenaeabelezadostextos.blogspot.com www1.folha.uol.com.br
  12. 12. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte Padrão de projeto tem a ver com arquitetura de software. @fgsl
  13. 13. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte Referência: Gangue dos Quatro @fgsl http://en.wikipedia.org/wiki/Gang_of_Four
  14. 14. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte Ralph Johnson, Erich Gamma,Richard Helm e John Vlissides O tempo passa para todos... 1995 @fgsl
  15. 15. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl Eles descrevem 23 padrões de projeto em seu livro, agrupados em três categorias: de criação, estruturais e comportamentais. Veremos aqui 10 deles. doggies.com
  16. 16. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Padrões de Criação
  17. 17. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Abstract Factory & Factory Method Classes Objetos colorirdesenhos.com minhainfancia.com.br faberludens.com.br
  18. 18. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que servem? Para criar objetos complexos facilmente sem copiar e colar. cmota.no.sapo.pt
  19. 19. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que servem? Para desacoplar a criação de determinados objetos de um sistema. blog.brasilacademico.com
  20. 20. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que servem? Quando você não sabe qual objeto deve ser criado em determinado momento. flickriver.com
  21. 21. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Qual a diferença entre os dois? A diferença é sutil. Abstract Factory é usado quando você não sabe qual classe irá iniciar a solicitação para criação do objeto. Factory Method é aplicado quando se tem uma classe determinada para quem os pedidos de criação serão dirigidos. agrupamontenegro.com
  22. 22. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Exemplo: conexão com banco de dados A aplicação pode trabalhar com diferentes “marcas” de bancos de dados. Como saber qual objeto de conexão instanciar e ter a mesma interface para manipular os dados?
  23. 23. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl if ($database == MYSQL) { ... } if ($database == POSTGRESQL) { ... } if ($database == SQLSERVER) { ... } if ($database == ORACLE) { ... } Assim? sargentolago.blogspot.com
  24. 24. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Cubrid dBase DB++ FrontBase filePro Firebird/InterBase Informix IBM DB2 — IBM DB2, Cloudscape and Apache Derby Ingres — Ingres DBMS, EDBC, and Enterprise Access Gateways MaxDB Mongo mSQL Mssql — Microsoft SQL Server MySQL Mysqli — Extensão MySQL Melhorada Mysqlnd — MySQL Native Driver mysqlnd_qc — Mysqlnd query result cache plugin OCI8 — Oracle OCI8 Ovrimos SQL Paradox — Paradox File Access PostgreSQL SQLite SQLite3 Sybase tokyo_tyrant estou-sem.blogspot.com
  25. 25. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl É possível adotar uma interface única para a manipulação de dados com o uso de camadas de abstração de dados. DBA — Database (dbm-style) Abstraction Layer dbx ODBC PDO — PHP Data Objects
  26. 26. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Com uma camada de abstração, uma única classe pode, por configuração, delegar a uma terceira, em tempo de execução, a criação do objeto de conexão. $conn = Zend_Db::factory($adapter,$config);
  27. 27. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Singleton marketingassassin.wordpress.com viswiki.com kshs.org John Benjamin
  28. 28. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que serve? Para garantir que uma instância seja exclusiva e com acesso somente para leitura. sarakertesz.blogspot.comdigitaldrops.com.br
  29. 29. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Como implementar? Primeiro, torne o construtor da classe privado. private function __construct() Depois, crie um método estático público que retorne sempre a mesma instância (armazenada em um atributo estático da classe).
  30. 30. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Como implementar? class SingletonSample { private static $_instance = null; private function __construct() { } public static function getInstance() { if (self::$_instance == null) { self::$_instance = new SingletonSample(); } return self::$_instance; } }
  31. 31. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Como implementar? $singleton = SingletonSample::getInstance();
  32. 32. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Padrões Estruturais portoalegre.olx.com.br
  33. 33. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Adapter
  34. 34. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que serve? Para proteger sua aplicação de mudanças na API de bibliotecas externas. Para permitir que você crie bibliotecas que sejam fáceis de serem atualizadas pelos usuários, mesmo quando a API sofrer modificações.
  35. 35. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Vantagens Adapter desloca a manutenção de vários pontos da aplicação, ou de várias aplicações, para um único componente de software. Permite evoluir a API de uma biblioteca sem afetar o funcionamento de uma aplicação existente.
  36. 36. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Esquema geral Aplicação Adapter API da biblioteca
  37. 37. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Dica facilita a criação de adaptadores e já está preparado para trabalhar com namespaces.
  38. 38. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Decorator boards.nbc.com rumahcons.blogspot.com
  39. 39. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que serve? Para estruturar seu código de modo a adicionar facilmente características usadas sob certas condições ou raramente sem colocar o código extra diretamente em sua classe.
  40. 40. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Como funciona? Um objeto incorpora outros objetos em tempo de execução, encapsulando seus métodos. Os métodos do objetos encapsulado são chamados como se fosse do objeto encapsulador.
  41. 41. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Como funciona? http://www.marveldirectory.com/individuals/r/rogue.htm http://www.strayhair.com comicsofrhodey.blogspot.com
  42. 42. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Como funciona? figurerealm.com thecomicforums.com dc.wikia.com
  43. 43. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Como funciona? outskirtsbattledome.wikispaces.com forum.daz3d.com
  44. 44. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Herança Múltipla PHP não suporta herança múltipla. Mas a aplicação de Decorator permite que uma classe “herde” os métodos de várias classes ao mesmo tempo. TER UM É MELHOR QUE SER UM!
  45. 45. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Mudança de Comportamento Decorator também permite que o comportamento de um objeto seja alterado depois que ele foi instanciado, sem modificar o comportamento dos outros objetos da mesma classe.
  46. 46. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Implementação Você pode manter um atributo na classe a ser “decorada”, que guarde uma coleção de “decoradores”. PHP possui o método __call(), que é invocado quando um método não pertencente à classe é chamado. O método __call() pode procurar na coleção qual objeto tem o método chamado, e executá-lo.
  47. 47. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Implementação A classe “decorada” possui métodos para adicionar e remover “decoradores”. Pode-se adotar uma convenção, em os métodos de adição e remoção dos “decoradores” sejam compostos pelos nomes das classes. Esses métodos não precisam ser definidos, pois o método __call() da classe “decorada” pode tratar isso.
  48. 48. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Implementação class Decorated { const DEFAULT_PREFIX = 'addDecorator'; private $_decorators = array(); public function __call($method,$arguments) { if (substr($method,0,strlen(DEFAULT_PREFIX)-1) == DEFAULT_PREFIX) { $className = substr($method,strlen(DEFAULT_PREFIX)); $this->_decorators[] = new $className(); } else { foreach($this->_decorators as $decorator) { if (method_exists($decorator,$method)) { return $decorator->$method(); } } } } }
  49. 49. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Implementação Outra forma de usar Decorator é definir via interface dois métodos: um para adicionar “decoradores” e outro que, sempre que é executado, também executa o método (de mesmo nome) dos “decoradores”.
  50. 50. Flávio Lisboa – PHP Conference 2010 ' A reprodução é livre, apenas cite a fonte @fgsl@fgsl Implementação class Decorated implements DecoratorInterface { private $_decorators = array(); public function addDecorator($decorator) { $this->_decorators[] = $decorator; } public function removeDecorator($decoratorSearched) { foreach($this->_decorators as $key => $currentDecorator) { $class = get_class($currentDecorator); if ($decoratorSearched instanceof $class) { unset($this->_decorators[$key]); break; } } } public function execute() { foreach($this->_decorators as $decorator) { $decorator->execute(); } } }
  51. 51. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Proxy fundamig.org.br seriesecia-br.blogspot.com
  52. 52. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que serve? Para prover acesso a um objeto sem fornecer o objeto diretamente. Para adiar a criação de um objeto que usa recursos caros e nem sempre é necessário. Para restringir acesso aos métodos de um objeto.
  53. 53. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para domar o programador caozen.blogspot.comliquidsilver.org
  54. 54. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Como funciona? class ProxySubject{ private $_subject; private function lazyLoad() { if (!$this->_subject instanceof Subject) { $this->_subject = new Subject(); } } public function execute() { $this->lazyLoad(); return $this->_subject->execute(); } } $proxy = new ProxySubject(); PHP Architects Guide to PHP Design Patterns
  55. 55. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Padrões Comportamentais filipesoad.wordpress.com
  56. 56. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Chain of Responsability Spiderman,byStanLee&SteveDitko
  57. 57. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que serve? Para evitar o acoplamento do remetente de uma solicitação ao seu destinatário, dando a mais de um objeto a chance de tratar a solicitação.
  58. 58. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Estudo de Caso Tratamento de requisição HTTP no Zend Framework From Zend Framework in Action
  59. 59. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Observer pt.dreamstime.com bakashihzonho.blogspot.com
  60. 60. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que serve? Para alertar muitos objetos quando o estado de um certo objeto mudar. physikbr.blogspot.com
  61. 61. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Como funciona? Um objeto Observável registra Observadores. Quando o estado de Observável muda, ele notifica os Observadores. PHP Architects Guide to PHP Design Patterns
  62. 62. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Strategy enciclopedia.com.pt ndr.de tudoehistoria.spaceblog.com.br rajputbrotherhood.com
  63. 63. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que serve? Para alterar facilmente a implementação interna de um objeto, escolhendo uma implementação para ser usada no momento em que o script é executado. Para codificar um conjunto de implementações fáceis de manter e estender.
  64. 64. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Exemplo: algoritmos genéticos Um algoritmo genético é uma técnica de busca, usada para encontrar soluções aproximadas em problemas de otimização. Todos os algoritmos genéticos consistem dos mesmos passos. O que muda (além dos argumentos) é a função-objetivo, que irá avaliar os indivíduos.
  65. 65. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl class GeneticAlgorithm { protected $_population = null; protected $_args = array(); protected $_fitness = null; public function __construct($population,array $args, $fitness) { $this->_population = $population; $this->_args = $args; $this->_fitness = $fitness; } public function execute() { if (null == $this->_fitness) return $this->_fitness->execute($population, $args); else return $this->executeDefault(); } } Strategy
  66. 66. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Iterator miniempresaflordelotus.blogspot.com
  67. 67. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Para que serve? Para manipular facilmente qualquer coleção de objetos. monsores.net
  68. 68. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Exemplo: iterando sobre resultados de consulta Para manipular facilmente qualquer coleção de objetos. $keys = Zend_Registry::get('keys'); $dmc = new Categoria(); $categorias = $dmc->find($keys); do { $categoria = $categorias->current(); printf("%s",$categoria->nome); }while ($categorias->next())
  69. 69. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Boas Práticas 1)Teste seu código 2)Automatize seus testes 3)Integre continuamente a aplicação
  70. 70. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Boas Práticas 4)Refatore o código 5)Simplifique o código 6)Aplique padrões de projeto
  71. 71. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Boas Práticas 7)Documente o código 8)Controle as versões
  72. 72. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Boas Práticas 9)Use um ambiente de desenvolvimento integrado 10)Use frameworks, pois ele implementam os padrões de projeto
  73. 73. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Sugestões
  74. 74. Flávio Lisboa – PHP Conference 2010 Obrigado! A reprodução é livre, apenas cite a fonte @fgsl www.fgsl.eti.br Little Einsteins by Walt Disney

×