SlideShare uma empresa Scribd logo
1 de 74
Baixar para ler offline
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
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.blogspot.com
ondecomprar.net
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
repetidamente
em nosso
ambiente...
@fgsl
Naruto,byMasashiKishimoto
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
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
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
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
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
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
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
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
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
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
Classes Objetos
colorirdesenhos.com
minhainfancia.com.br
faberludens.com.br
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
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
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
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
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?
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
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
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
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);
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
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
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).
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;
}
}
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como implementar?
$singleton = SingletonSample::getInstance();
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Padrões Estruturais
portoalegre.olx.com.br
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 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.
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.
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Esquema geral
Aplicação
Adapter
API da biblioteca
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.
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Decorator
boards.nbc.com
rumahcons.blogspot.com
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.
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.
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
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
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Como funciona?
outskirtsbattledome.wikispaces.com
forum.daz3d.com
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!
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.
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.
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.
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();
}
}
}
}
}
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”.
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();
}
}
}
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Proxy
fundamig.org.br
seriesecia-br.blogspot.com
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.
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Para domar o programador
caozen.blogspot.comliquidsilver.org
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
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Padrões Comportamentais
filipesoad.wordpress.com
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Chain of Responsability
Spiderman,byStanLee&SteveDitko
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.
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
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Observer
pt.dreamstime.com
bakashihzonho.blogspot.com
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
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
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
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.
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.
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
Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte
@fgsl@fgsl
Iterator
miniempresaflordelotus.blogspot.com
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
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())
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
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
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
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
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 Einsteins by Walt Disney

Mais conteúdo relacionado

Mais procurados

Conhencendo Python e por que ela importa?
Conhencendo Python e por que ela importa?Conhencendo Python e por que ela importa?
Conhencendo Python e por que ela importa?Marcel Caraciolo
 
Introdução a Linguagem de Programação Python
Introdução a Linguagem de Programação PythonIntrodução a Linguagem de Programação Python
Introdução a Linguagem de Programação PythonFlávio Ribeiro
 
Python Módulo Básico - Introdução a linguagem Python
Python Módulo Básico - Introdução a linguagem PythonPython Módulo Básico - Introdução a linguagem Python
Python Módulo Básico - Introdução a linguagem Pythonantonio sérgio nogueira
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do GoogleLuciano Ramalho
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nívelIgor Sobreira
 
Desenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyDesenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyGilson Filho
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonIgor Sobreira
 
Tutorial Django + Python
Tutorial Django + PythonTutorial Django + Python
Tutorial Django + PythonMateus Padua
 
Palestra Zend Framework PHPSC Conf 2010
Palestra Zend Framework PHPSC Conf 2010Palestra Zend Framework PHPSC Conf 2010
Palestra Zend Framework PHPSC Conf 2010Flávio Lisboa
 
Arduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojoArduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojoLuciano Ramalho
 
Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonPriscila Mayumi
 
DRYing the Skeleton: Reducing code repetition in ZF2
DRYing the Skeleton: Reducing code repetition in ZF2DRYing the Skeleton: Reducing code repetition in ZF2
DRYing the Skeleton: Reducing code repetition in ZF2Er Galvão Abbott
 
Introdução à linguagem de programação Python
Introdução à linguagem de programação PythonIntrodução à linguagem de programação Python
Introdução à linguagem de programação PythonCarlos Schults
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de djangorosenclever
 
Seminário PHP São Paulo 2013 - traits no PHP 5.4 - muito além da herança
Seminário PHP São Paulo 2013 - traits no PHP 5.4 - muito além da herançaSeminário PHP São Paulo 2013 - traits no PHP 5.4 - muito além da herança
Seminário PHP São Paulo 2013 - traits no PHP 5.4 - muito além da herançaFlávio Lisboa
 
Php7 esta chgando! O que você precisa saber
Php7 esta chgando! O que você precisa saberPhp7 esta chgando! O que você precisa saber
Php7 esta chgando! O que você precisa saberEr Galvão Abbott
 
O futuro do elephante: as promessas do php para 2019
O futuro do elephante: as promessas do php para 2019O futuro do elephante: as promessas do php para 2019
O futuro do elephante: as promessas do php para 2019Cassio Santos
 

Mais procurados (20)

Conhencendo Python e por que ela importa?
Conhencendo Python e por que ela importa?Conhencendo Python e por que ela importa?
Conhencendo Python e por que ela importa?
 
Introdução a Linguagem de Programação Python
Introdução a Linguagem de Programação PythonIntrodução a Linguagem de Programação Python
Introdução a Linguagem de Programação Python
 
Python Módulo Básico - Introdução a linguagem Python
Python Módulo Básico - Introdução a linguagem PythonPython Módulo Básico - Introdução a linguagem Python
Python Módulo Básico - Introdução a linguagem Python
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nível
 
Desenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyDesenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2py
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 
PHP 7 - A Maioridade do PHP
PHP 7 - A Maioridade do PHPPHP 7 - A Maioridade do PHP
PHP 7 - A Maioridade do PHP
 
Tutorial Django + Python
Tutorial Django + PythonTutorial Django + Python
Tutorial Django + Python
 
Palestra Zend Framework PHPSC Conf 2010
Palestra Zend Framework PHPSC Conf 2010Palestra Zend Framework PHPSC Conf 2010
Palestra Zend Framework PHPSC Conf 2010
 
Poo
PooPoo
Poo
 
Canivete python
Canivete pythonCanivete python
Canivete python
 
Arduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojoArduino: hardware hacking & coding dojo
Arduino: hardware hacking & coding dojo
 
Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação Python
 
DRYing the Skeleton: Reducing code repetition in ZF2
DRYing the Skeleton: Reducing code repetition in ZF2DRYing the Skeleton: Reducing code repetition in ZF2
DRYing the Skeleton: Reducing code repetition in ZF2
 
Introdução à linguagem de programação Python
Introdução à linguagem de programação PythonIntrodução à linguagem de programação Python
Introdução à linguagem de programação Python
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de django
 
Seminário PHP São Paulo 2013 - traits no PHP 5.4 - muito além da herança
Seminário PHP São Paulo 2013 - traits no PHP 5.4 - muito além da herançaSeminário PHP São Paulo 2013 - traits no PHP 5.4 - muito além da herança
Seminário PHP São Paulo 2013 - traits no PHP 5.4 - muito além da herança
 
Php7 esta chgando! O que você precisa saber
Php7 esta chgando! O que você precisa saberPhp7 esta chgando! O que você precisa saber
Php7 esta chgando! O que você precisa saber
 
O futuro do elephante: as promessas do php para 2019
O futuro do elephante: as promessas do php para 2019O futuro do elephante: as promessas do php para 2019
O futuro do elephante: as promessas do php para 2019
 

Destaque

Padrão de Projetos singleton
Padrão de Projetos singletonPadrão de Projetos singleton
Padrão de Projetos singletonWendel Moreira
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareCarlos Santana
 
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebProposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebEr Galvão Abbott
 
Boas práticas de django
Boas práticas de djangoBoas práticas de django
Boas práticas de djangoFilipe Ximenes
 
Introdução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de SoftwareIntrodução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de SoftwareWillian Carminato
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projetoejdn1
 

Destaque (7)

Padrão de Projetos singleton
Padrão de Projetos singletonPadrão de Projetos singleton
Padrão de Projetos singleton
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebProposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
 
Boas práticas de django
Boas práticas de djangoBoas práticas de django
Boas práticas de django
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
 
Introdução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de SoftwareIntrodução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de Software
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projeto
 

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

Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010
Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010
Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010Flávio Lisboa
 
MVC com Zend Framework - PHP Conference Brasil 2010
MVC com Zend Framework - PHP Conference Brasil 2010MVC com Zend Framework - PHP Conference Brasil 2010
MVC com Zend Framework - PHP Conference Brasil 2010Flávio Lisboa
 
Automação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com PythonAutomação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com PythonFabio Spanhol
 
O Prazer De Trabalhar Com Python
O Prazer De Trabalhar Com PythonO Prazer De Trabalhar Com Python
O Prazer De Trabalhar Com PythonMarinho Brandão
 
Composer dependency manager
Composer   dependency managerComposer   dependency manager
Composer dependency managerVitor Mattos
 
Como contribuir-com-open-source-php conference-2016
Como contribuir-com-open-source-php conference-2016Como contribuir-com-open-source-php conference-2016
Como contribuir-com-open-source-php conference-2016Marcos Paulo
 
php4android: desenvolva aplicações android em PHP
php4android: desenvolva aplicações android em PHPphp4android: desenvolva aplicações android em PHP
php4android: desenvolva aplicações android em PHPRamon Ribeiro Rabello
 
Padrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a ObjetosPadrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a ObjetosFabio Kon
 
Django: desenvolvendo aplicações web de maneira simples e rápida!
Django: desenvolvendo aplicações web de maneira simples e rápida!Django: desenvolvendo aplicações web de maneira simples e rápida!
Django: desenvolvendo aplicações web de maneira simples e rápida!Felipe Queiroz
 
PHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e SeguraPHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e SeguraKleber Silva
 
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreamsJacqueline Abreu
 
TDC Florianópolis 2018 - Trilha PHP - O que mudou internamente no PHP7 ?
TDC Florianópolis 2018 - Trilha PHP - O que mudou internamente no PHP7 ?TDC Florianópolis 2018 - Trilha PHP - O que mudou internamente no PHP7 ?
TDC Florianópolis 2018 - Trilha PHP - O que mudou internamente no PHP7 ?Cassio Santos
 
Python na reformulação arquitetural do projeto SciELO
Python na reformulação arquitetural do projeto SciELOPython na reformulação arquitetural do projeto SciELO
Python na reformulação arquitetural do projeto SciELOGustavo Fonseca
 
Desenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software LivreDesenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software Livreelliando dias
 

Semelhante a Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010 (20)

Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010
Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010
Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010
 
MVC com Zend Framework - PHP Conference Brasil 2010
MVC com Zend Framework - PHP Conference Brasil 2010MVC com Zend Framework - PHP Conference Brasil 2010
MVC com Zend Framework - PHP Conference Brasil 2010
 
Automação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com PythonAutomação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com Python
 
O Prazer De Trabalhar Com Python
O Prazer De Trabalhar Com PythonO Prazer De Trabalhar Com Python
O Prazer De Trabalhar Com Python
 
PHP: Evolução
PHP: EvoluçãoPHP: Evolução
PHP: Evolução
 
Composer dependency manager
Composer   dependency managerComposer   dependency manager
Composer dependency manager
 
Como contribuir-com-open-source-php conference-2016
Como contribuir-com-open-source-php conference-2016Como contribuir-com-open-source-php conference-2016
Como contribuir-com-open-source-php conference-2016
 
php4android: desenvolva aplicações android em PHP
php4android: desenvolva aplicações android em PHPphp4android: desenvolva aplicações android em PHP
php4android: desenvolva aplicações android em PHP
 
GoF.ppt
GoF.pptGoF.ppt
GoF.ppt
 
Padrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a ObjetosPadrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a Objetos
 
Python Zope Plone - Fiocruz
Python Zope Plone - FiocruzPython Zope Plone - Fiocruz
Python Zope Plone - Fiocruz
 
Django: desenvolvendo aplicações web de maneira simples e rápida!
Django: desenvolvendo aplicações web de maneira simples e rápida!Django: desenvolvendo aplicações web de maneira simples e rápida!
Django: desenvolvendo aplicações web de maneira simples e rápida!
 
Apresentação faef
Apresentação faefApresentação faef
Apresentação faef
 
PHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e SeguraPHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e Segura
 
Python Zope Plone - Ftec
Python Zope Plone - FtecPython Zope Plone - Ftec
Python Zope Plone - Ftec
 
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
 
TDC Florianópolis 2018 - Trilha PHP - O que mudou internamente no PHP7 ?
TDC Florianópolis 2018 - Trilha PHP - O que mudou internamente no PHP7 ?TDC Florianópolis 2018 - Trilha PHP - O que mudou internamente no PHP7 ?
TDC Florianópolis 2018 - Trilha PHP - O que mudou internamente no PHP7 ?
 
Python na reformulação arquitetural do projeto SciELO
Python na reformulação arquitetural do projeto SciELOPython na reformulação arquitetural do projeto SciELO
Python na reformulação arquitetural do projeto SciELO
 
Desenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software LivreDesenvolvendo Aplicações com Software Livre
Desenvolvendo Aplicações com Software Livre
 
Php do Jeito Certo
Php do Jeito CertoPhp do Jeito Certo
Php do Jeito Certo
 

Mais de Flávio Lisboa

Criando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPCriando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPFlávio Lisboa
 
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaCooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaFlávio Lisboa
 
Aprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasAprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasFlávio Lisboa
 
Ciência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoCiência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoFlávio Lisboa
 
Turbinando microsserviços em PHP
Turbinando microsserviços em PHPTurbinando microsserviços em PHP
Turbinando microsserviços em PHPFlávio Lisboa
 
O que esperar do framework Laminas
O que esperar do framework LaminasO que esperar do framework Laminas
O que esperar do framework LaminasFlávio Lisboa
 
PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?Flávio Lisboa
 
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Flávio Lisboa
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHPFlávio Lisboa
 
Como se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoComo se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoFlávio Lisboa
 
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPA demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPFlávio Lisboa
 
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamComunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamFlávio Lisboa
 
Criação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosCriação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosFlávio Lisboa
 
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosEstudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosFlávio Lisboa
 
Arquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosArquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosFlávio Lisboa
 
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasSemeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasFlávio Lisboa
 
O que é programação de computadores
O que é programação de computadoresO que é programação de computadores
O que é programação de computadoresFlávio Lisboa
 
Economia em rede (comunidade)
Economia em rede (comunidade)Economia em rede (comunidade)
Economia em rede (comunidade)Flávio Lisboa
 
Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Flávio Lisboa
 

Mais de Flávio Lisboa (20)

Criando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPCriando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHP
 
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaCooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
 
Aprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasAprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com Laminas
 
Ciência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoCiência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com método
 
Turbinando microsserviços em PHP
Turbinando microsserviços em PHPTurbinando microsserviços em PHP
Turbinando microsserviços em PHP
 
O que esperar do framework Laminas
O que esperar do framework LaminasO que esperar do framework Laminas
O que esperar do framework Laminas
 
PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?
 
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHP
 
Como se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoComo se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundo
 
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPA demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
 
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamComunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
 
Criação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosCriação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dados
 
Amanhecer esmeralda
Amanhecer esmeraldaAmanhecer esmeralda
Amanhecer esmeralda
 
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosEstudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
 
Arquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosArquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviços
 
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasSemeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
 
O que é programação de computadores
O que é programação de computadoresO que é programação de computadores
O que é programação de computadores
 
Economia em rede (comunidade)
Economia em rede (comunidade)Economia em rede (comunidade)
Economia em rede (comunidade)
 
Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)
 

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

  • 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. Flávio Lisboa – PHP Conference 2010 Quem sou eu 2007 2008 2009 @fgsl@fgsl A reprodução é livre, apenas cite a fonte
  • 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. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte Qual nosso objetivo? @fgsl disneypedia.com.br
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Padrões de Criação
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Como implementar? $singleton = SingletonSample::getInstance();
  • 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. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Adapter
  • 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. 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. 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. 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. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Decorator boards.nbc.com rumahcons.blogspot.com
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Padrões Comportamentais filipesoad.wordpress.com
  • 56. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Chain of Responsability Spiderman,byStanLee&SteveDitko
  • 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. 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. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Observer pt.dreamstime.com bakashihzonho.blogspot.com
  • 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. 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. 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. 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. 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. 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. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Iterator miniempresaflordelotus.blogspot.com
  • 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. 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. 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. 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. 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. 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. Flávio Lisboa – PHP Conference 2010 A reprodução é livre, apenas cite a fonte @fgsl@fgsl Sugestões
  • 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