Patterns e Anti-Patterns para o desenvolvimento em PHP · Não será seguida neste tutorial devido...

84
© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 1 Patterns e Anti-Patterns Patterns e Anti-Patterns para o desenvolvimento em para o desenvolvimento em PHP PHP Fernando Lozano Fernando Lozano [email protected] [email protected] http://www.lozano.eti.br http://www.lozano.eti.br Consultor Independente Prof. Faculdades UniABEU Prof. Faculdades Estácio de Sá Mestrando NCE/UFRJ

Transcript of Patterns e Anti-Patterns para o desenvolvimento em PHP · Não será seguida neste tutorial devido...

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 1

Patterns e Anti-PatternsPatterns e Anti-Patternspara o desenvolvimento empara o desenvolvimento em

PHPPHP

Fernando LozanoFernando [email protected]@lozano.eti.brhttp://www.lozano.eti.brhttp://www.lozano.eti.br

Consultor IndependenteProf. Faculdades UniABEU

Prof. Faculdades Estácio de SáMestrando NCE/UFRJ

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 2

CopyrightCopyright

● © 2003, Fernando Silva Lozanowww.lozano.eti.br

● Esta apresentação ou partes dela podem ser reproduzidos em qualquer meio, desde que seja citada a sua origem e mantidas as referências à página pessoal do autor

● Alterações são permitidas atendendo a cláusua acima, desde que sejam claramente identificadas como trabalho derivado e os autores das modificações sejam citados

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 3

Sobre o AutorSobre o Autor● Red Hat Certified Engineer

LPI Certified Professional Level ISair GNU/Linux Certified Professional

● IBM Certified Network EngineerIBM Certified DB2 Administrator & Developer

● Microsoft Certified Systems EngineerMicrosoft Certified Solutions Developer

● Webmaster da FSFConselheiro do LPI Brasil

● Colaborador das revistasPC Master, JavaMagazine, Revista do Linux

● Autor do Livro “Java em GNU/Linux”ed. Alta Books, 2002 www.altabooks.com.br

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 4

IntroduçãoIntrodução

● Hoje o PHP é uma das ferramentas mais populares para o desenvolvimento de aplicações web, em grande parte devido à sua facilidade de aprendizado, permitindo construir aplicações úteis com pouco conhecimento da linguagem

● Entretanto, conhecer alguns comandos não torna o desenvolvedor apto a desenvolver aplicações mais complexas ou a adapta-las no ritmo exigido pelo mercado globalizado

● Para auxiliar o desenvolvedor na evolução para um estilo de trabalho mais profissional foi criada esta apresentação sobre Padrões de Projeto em PHP

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 5

ObjetivosObjetivos

● Apresentar vícios de programação comuns, herdados do PHP3, decorrentes do estilo imediatista dos desenvolvedores iniciantes, ou consequência de metodogias informais, demonstrando quando eles podem se transformar anti-patterns

● Comparar com boas práticas (best practices) relevantes para sanar as deficiências apontadas, caracterizando-as como design patterns(padrões de projeto)

● Estimular a discussão entre a comunidade PHP para a evolução das suas práticas de desenvolvimento

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 6

AgendaAgenda

● O que são design patterns e anti-patterns● PHP x Outras linguagens OO● Padrões para a Web e Sistemas de Informação● Estilos de programação CGI x SSI e templates● Técnicas para tratamento de erros e cache● Desenvolvimento Three-Tier● Data Access Objects● Value Objects● Model-View-Controller

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 7

Parte IParte I

Introdução aosPadrões de Projeto para Software:

Design Patterns e Anti-Patterns

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 8

Origem dos Padrões de ProjetoOrigem dos Padrões de Projeto

● O conceito surgiu do trabalho de Christopher Alexandrer, focado em engenharia civil e arquitetura, ao observar que a maioria dos projetos na área poderia ser descrito como a reunião de um pequeno conjunto de soluções pontuais

● Sua aplicação ao desenvolvimento de software foi iniciada pelo livro Design Patterns: Elements of Reusable Object-Oriented Software, de Erich Gamma, Richard Helm, Ralph Jonhson e John Vlissides, que ficaram conhecidos como a “Gangue dos Quatro” (GoF, Gand of Four)

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 9

Design (inglês) xDesign (inglês) xProjeto (português)Projeto (português)

● O termo design seria geralmente traduzido para “desenho”, entretanto este termo não evoca a preocupação com a funcionalidade (comportamento, necessidades e consequências) intrínseca ao termo original

● O termo projeto, embora possa levar à interpretações errôneas pelo seu uso no contexto de ciclo de vida de desenvolvimento de software, (análise, projeto, implementação e testes), expressa melhor o significado do termo original

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 10

O que é um Padrão de ProjetoO que é um Padrão de Projeto

● Um padrão é uma solução aplicada repetidamente, com pequenas variações, a problemas recorrentes em um dado domínio de conhecimento

● Padrões encapsulam a experiênca obtida pela indústria de modo facilmente aprendido e utilizado mesmo por iniciantes, aumentando o nível de qualidade do trabalho realiado pelo profisional

● Padrões facilitam a comunicação entre profissionais ao definir um jargão comum e permitir a discussão sobre projetos em nível maior de abstração

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 11

Exemplos de PadrõesExemplos de Padrões

● Um loop para exibição de registros em uma página PHP segue sempre o mesmo estilo, variando apenas a consulta SQL e a formatação dos campos, sendo por tanto um padrão rapidamente aprendido e utilizado mesmo que informalmente

● O modo de funcionamento de sites de comércio eletrônico, onde se navega por um catálogo de produtos que podem ser colocados em um carrinho de compras, e ao fim é realizado o check-out (efetivação da compra), quando são fornecidas informações sobre o pagamento e entrega, também é um padrão

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 12

Padrões servem apenas para Padrões servem apenas para codificação (programação)?codificação (programação)?

● Embora os padrões de projeto de software sejam vistos em geral no contexto de linguagens de programação, o conceito pode ser aplicado a todas as etapas do ciclo de vida, desde análise de requisitos até testes funcionais e de aceitação

● Padrões podem ser específicos para uma área de aplicação, para uma tecnologia, ou para uma linguagem de programação, mas também podem ser genéricos, adequando-se a qualquer tipo de programa, em qualquer camada da sua arquitetura

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 13

Padrões de Projeto e Padrões de Projeto e Orientação a ObjetosOrientação a Objetos

● O trabalho sobre padrões de projeto em software foi originado no contexto de OO porque este fornece mecanismos para facilitar a reutilização das soluções (código), mas o conceito, e muitos dos padrões específicos, podem ser aplicados a linguagens e metodologias não-OO

● Além disso, as técnicas de modelagem OO (em especial a UML) ajudam a descrever um padrão de modo independente da linguagem de programação adotada

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 14

Padrões de Projeto xPadrões de Projeto xLimites da TecnologiaLimites da Tecnologia

● Padrões de “baixo nível” tendem a desaparecer com a evolução da tecnologia, por exemplo:

● O uso de ponteiros para funções em C e Pascal é um padrão para extensão da funcionalidade de um componente em tempo de execução, mas perde o sentido após a incorporação a linguagens OO na forma de métodos virtuais ou de referências polimórficas

● O uso de cookies para manter o estado de um visitante navegando pelo site (ex: carrinho de compras) deixa de ser um padrão quando o PHP4 incorporou mecanismos (funções) para gerenciamento de sessões HTTP

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 15

Os padrões Clássicos (GoF)Os padrões Clássicos (GoF)

● O trabalho original do GoF, utilizando a linguagem Smalltalk e rapidamente adaptado para C++ e Java, classificava os padrões básicos em três categorias:

● CriacionaisEstratégias para decidir que implementação de uma dada interface será utilizada, ou quando é necessário (ou não) instanciar um novo objeto

● EstruturaisPadrões que definem o relacionamento entre elementos de informação ou componentes de uma aplicação

● ComportamentaisExplicitam a forma como os componentes da aplicação se comunicam para atingir um objetivo

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 16

Alguns padrões Clássicos:Alguns padrões Clássicos:CriacionaisCriacionais

● FactoryUma classe decide (não importa como) que objeto criar dado um conjunto de parâmetros

● SingletonClasse que sempre possui uma única instância ativa, útil para simular “variáveis globais” em uma aplicação OO

● PrototypeCriação de instâncias à partir da clonagem de um objeto-modelo (protótipo)

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 17

Alguns padrões Clássicos:Alguns padrões Clássicos:EstruturaisEstruturais

● AdapterConverte entre duas interfaces diferentes porém equivalentes

● CompositeQuando a parte e o todo devem ser intercambiáveis (obedecer a mesma interface)

● ProxyObjeto que representa outro objeto, recebedo requisições em seu lugar

● DecoradorAdiciona funcionalidade a um objeto, colocando-se no “meio do caminho” da comunicação entre ele e outros objetos

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 18

Os padrões Clássicos:Os padrões Clássicos:ComportamentaisComportamentais

● ObserverObjeto que é notificado de eventos ocorrigos (ou gerados) por outro objeto

● Chain of ResponsibilityQuando vários objetos estão “em fila”, e cada um tem a oportunidade de responder (ou não) a uma requisição

● StrategyClasse que encapsula um algoritmo, de modo que muda-se a instância fornecida para mudar o algoritmo

● IteratorSabe como percorrer uma estrutura de dados, fornecendo sempre o próximo elemento

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 19

Descrição Formal dosDescrição Formal dosPadrões de ProjetoPadrões de Projeto

● O trabalho do GoF e os trabalhos que se seguem definiram uma maneira forma, padronizada de descrever padrões de projeto, que consiste em:

● Contexto (ambiente que gera o padrão)● Problema (que o padrão resolve)● Forças (motivações para usar ou não o padrão)● Solução (descrição do padrão em si)● Consequências (prós e contras de implementações)● Padrões Relacionados

● Não será seguida neste tutorial devido às restrições de tempo

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 20

Padrões Enterprise JavaPadrões Enterprise Java

● O universo J2EE catalogou uma série de padrões úteis para aplicações web ou distribuídas, muitos dos quais diretamente aplicáveis ao desenvolvimento em PHP

● Estes padrões foram classificados segundo uma visão em várias camadas da arquitetura de uma aplicação:

● Client Tier (plataforma do usuário)● Presentation Tier (interação com o usuário)● Business Tier (regras de negócio)● Integration Tier (acesso a recursos/sistemas externos)● Resource Tier (bases de dados, validação de crédito)

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 21

Camadas J2EE x PHPCamadas J2EE x PHP

● Navegador● JSP,

Applets,Swing

● Classes,EJBs,RMI

● JDBC,JMS,JAXP

● BDs,XML,

● Navegador● HTML,

Templates,GTK+

● Classes,funções

● Módulos,PEAR,WebServices

● BDs,E-mail

● Cliente● Apresentação

● Negócios

● Integração

● Recursos

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 22

Padrões Enterprise Java:Padrões Enterprise Java:Presentation TierPresentation Tier

● Intercepting FilterPré ou pós processamento de requisições

● Front ControllerFluxo de trabalho e navegação

● View HelperReunião de dados para visualização

● Composite ViewVisualização à partir de componentes menores

● Dispatcher ViewVisualizações alternativas para os mesmos dados

● Service to WorkerDispatcher View + Front Controller + View Helper

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 23

Padrões Enterprise Java:Padrões Enterprise Java:Business TierBusiness Tier

● Business DelegateIntermediário entre camadas de apresentação e negócios, eliminando o seu acoplamento

● Value Object - VOObjeto contendo apenas dados, para otimizaçao do fluxo de informações entre as camadas

● Session FaçadeProcessos e fluxos de trabalho de negócios

● Composite EntityEntidade agregando dados de várias origens

● Value Obj. AssemblerMontador de VOs complexos

● Value List HandlerProcessamento e cache de resultados

● Service LocatorCriação de referências a objetos de negócios

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 24

Padrões Enterprise Java:Padrões Enterprise Java:Integration TierIntegration Tier

● Data Access ObjectAcesso a fontes de dados diversas

● Service ActivatorExecuçao assíncrona de serviços externos

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 25

Afinal, por que o “buzz” em Afinal, por que o “buzz” em torno dos padrões?torno dos padrões?

● Provavemente o leitor já reconheceu vários dos padrões citados como parte do seu dia-a-dia, mesmo sem consciência do conceito de padrão de projeto, e pode se questionar se não há barulho demais para algo que é intuitivo na atividade de programação

● O valor dos padrões não está em trazer técnicas únicas e revolucionárias, mas sim em consolidar o conhecimento acumulado para fácil aprendizado e utilização, e chamar a importância da atividade de projeto no desenvolvimento de software

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 26

O que é um Anti-PatternO que é um Anti-Pattern

● Todo programador desenvolve ao longo do tempo uma série de “vícios”, incorporando práticas que prejudicam o entendimento, manutenção e performance dos sistemas, ou simplesmente diminuem sua produtividade

● Estes vícios decorrem da evolução da tecnologia...(não uso de recursos antes indisponíveis)

● ...e da própria carreira(soluções para problemas simples não se adequam a problemas complexos)

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 27

Aplicabilidade dos Padrões de Aplicabilidade dos Padrões de Projeto para PHPProjeto para PHP

● O PHP hoje é utilizado em aplicações complexas e sites de grande volume, portanto se beneficia da aplicação das soluções comprovadas e da maior produtividade do desenvolvimento em equipe proporcionados pelos padrões

● O PHP possui recursos de OO e é em geral utilizado no mesmo contexto do Java (aplicações web) portanto a maioria dos padrões GoF e J2EE podem ser adaptadas para as suas particularidades

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 28

Guias, não dogmas!Guias, não dogmas!

● Lembrando, padrões de projeto não são soluções universais ou infalíveis; são soluções genéricas aplicáveis a várias situações

● Portanto avalie sempre o custo/benefício da aplicação de dada padrão a situações particulares

● Afinal, mais abstração gera mais complexidade e mais esforço – certifique-se que este overhead será compensado pelos ganhos do uso dos padrões!

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 29

Parte IIParte II

Idiomas daLinguagem de ProgramaçãoPHP: Hypertext Preprocessor

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 30

Aplicabilidade do PHPAplicabilidade do PHP

● O PHP surgiu como uma ferramenta para incorporar recursos dinâmicos simples a páginas HTML

● Evoluiu para uma linguagem de scripts rica em recursos, ocupando o espaço antes exclusivo de linguagens como Perl ou TCL

● Versões mais recentes suportam aplicações gráficas (GUI) baseadas no GTK+

● O PHP pode ainda utilizar sockets TCP, manipular mensagens SOAP e interfacear com CORBA, DOM e EJBs para aplicações distribuídas

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 31

Evolução do PHPEvolução do PHP

● PHP (Personal Home Page)Linguagem de macro simples para Web, utilizada via GCI

● PHP3 (PHP: Hypertext Preprocessor)Linguagem de script completa, extensível por módulos escritos em C e incorporada como extensão do Apache

● PHP4 (versão corrente)Recursos OO e grande expansão da biblitoca de módulos para bds, xml, gui, etc; suporte às APIs de extensão de outros servidores como o IIS

● PHP5 (em desenvolvimento)Modelo OO completo, equivalente a C++ e Java

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 32

Recursos OO do PHP4Recursos OO do PHP4

● Classes (tipos abstratos de dados)● Herança/Especialização● Polimorfismo● Construtores● Métodos de classe (últimos releases do PHP 4)● Identificação de tipos em tempo de execução● Serialização● Tipagem fraca (ao contrário do C++ ou Java)

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 33

Recursos OO Ausentes do PHPRecursos OO Ausentes do PHP

● Interfaces e classes abstratas● Restrições de visibilidade (private, protected)● Excessões estruturadas● Namespaces (pacotes)● Destrutores

(desnecessários, assim como em Java, pois não há alocação explícita de memória, mas são simulados pelo PEAR para tarefas de liberação de recursos, ex: conexões a bancos de dados)

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 34

O Projeto PEARO Projeto PEAR

● Embutido nas distribuições do PHP4, apesar de ser um projeto autônomo

● Inspirado no CPAN para Perl● Repositório de scripts, módulos e princialmente

classes reutilizáveis● Define padrões de nomeação, documentação e

codificação consistentes entre todas as classes da biblioteca

● Procure utilizar classes do PEAR em lugar dos módulos procedurais equivalentes!

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 35

Anti-Patterns x PadrõesAnti-Patterns x Padrões

● Código de Erro● Módulo de Acesso

a BD● SSS Degenerado● Interpretação

Repetitiva● Depuração ad-hoc

● Autenticação pelaaplicação

● Classe de Erro● API independente do

Banco● Templates● Cache

● Framework de LoggingTestes de Unidade

● Autenticação pelo servidor web

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 36

Anti-Pattern:Anti-Pattern:Códigos de erroCódigos de erro

● Em linguagens procedurais, é comum utilizar o valor de retorno de uma função para identificar situações de erro

● $err = fopen(“teste.txt”);if ($err) die(“Não foi possível abrir o arquivo”);

● Polui o fluxo principal do algoritmo com tratamento de situações de excessão

● Como diferenciar resultados normais de indicadores de erro?

● Como obter informações adicionais sobre o erro?

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 37

Anti-Pattern:Anti-Pattern:Variável global de erroVariável global de erro

● Alguns módulos – em especial os para conexão a bancos de dados – definem variáveis globais (possivelmente encapsuladas por uma função de acesso) para registrar a ocorrência de erros

● mysql_selectdb($nomebd);if (mysql_errno() == 1049) die(“banco de dados inexistente”)

● O indicador de erros pode ser perdido (sobreescrito) após a realização de novas operações

● A lógica para tratamento a situações particulares é baseada em “números mágicos”

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 38

Pattern:Pattern:Classe de ErroClasse de Erro

● O PEAR inclui a classe PEAR_Error para a indicação de situações de erro em qualquer método do pacote

● Situações de erro particulares derivam da classe base, e cada especialização pode incluir atributos próprios, encapsulando todas as informações disponíveis sobre a ocorrência

● A função is_a permite diferenciar resultados esperados de indicadores de erro

● A hierarquia de especialização permite trarar erros específicos e ainda assim responder a erros genéricos

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 39

Exemplo:Exemplo:Classe de ErroClasse de Erro

● Diferenciar conexão ok a erro de conexão● $con = DB::connect($dsn);

if (PEAR::isError($con)) { die(“não é possível conectar ao bd:\n” . $con->getMessage());}$res = $con->query($sql);

● Diferenciar erro na entrada dos dados de erro de banco ou rede

● $err = $contato->atualiza();if (is_a($err, “Error_Validacao”) // volta ao formulário para correçãoelseif (DB::isError($err)) // erro de banco, perdeu a conexão?

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 40

Classe de Erros xClasse de Erros xExcessões EstruturadasExcessões Estruturadas

● Classes de erro ainda poluem o fluxo principal do algoritmo e exigem lógica adicional caso o erro deva ser tratado em uma camada superior

● Excessões estruturadas, ao contrario, não poluem o fluxo principal, e são automaticamente passadas acima na pilha de ativação de procedimento até que sejam explicitamente capturadas

● try { /* conecta e acessa o bd */} catch (Exception e) { /* feedback ao usuario */}

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 41

Anti-Pattern:Anti-Pattern:Módulos de acesso a BDMódulos de acesso a BD

● O PHP 3 fornece apenas módulos procedurais específicos para o MySql, PostgreSQL, etc, cada qual com uma API ligeiramente diferente

● Para evitar que a aplicação esteja presa a um único banco, são desenvolvidos módulos customizados de modo a tornar possível rodar a aplicação em um banco diferente com o mínimo de esforço

● Entretanto estes módulos frequentemente não tem boa performance, não são reutilizáveis, ou quando o porte é necessário descobre-se que o módulo não alcança a desejada independência de BD

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 42

Pattern:Pattern:API independente de bancoAPI independente de banco

● A escrita de camadas de abstração de BD não é trivial e não se justifica reinventar a roda a cada novo projeto

● A PHPLib fornecia uma API independente de banco confiável e testada

● O PEAR fornece o módulo BD, que deve ser utilizado em preferência aos módulos procedurais, PHPLib (que não usufrui de todas as características do PHP4) ou aos módulos desenvolvindos “in house”

● Veja meu tutorial na COMDEX-SUCESU 2002 para mais detalhes sobre o PEAR DB

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 43

Anti-Pattern:Anti-Pattern:SSS DegeneradoSSS Degenerado

● Já vi artigos em revistas técnicas conceituadas sobre PHP afirmando que:“toda página PHP deve estar contida dentro de um único bloco <?php .. ?>”

● O resultado é código “CGI-like”, que vai contra a filosofia que levou à criação das linguagens de Server-Side Scripting, dentre as quais o PHP é a mais popular

● Aplicações PHP “estilo CGI” só podem ser mantidas por programadores, inviabilizando a participação de web designers no processo e comprometendo a usabilidade do site

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 44

Página PHP estilo CGIPágina PHP estilo CGI

● <?php $con = mysql_connect("", "", ""); mysql_select_db("banco",($con)); $sql = "SELECT nome, email FROM contato"; $res = mysql_query($sql,$con); echo("<html><body>\n"); echo("<table border=0>\n"); echo("<tr color=\"#a0a0a0\">\n"); echo("<td>Nome</td><td>E-mail</td>\n"); echo("</tr>\n"); while ($row = mysql_fetch_array($res)) { echo("<tr color=\"#e0e0e0\">\n"); echo("<td>$row[1]</td><td>$row[2]</td>\n"); echo("</tr>\n"); } echo("</table>\n"); mysql_free_result($res); mysql_close($con); echo("</body></html>\n");?>

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 45

Página PHP estilo SSSPágina PHP estilo SSS

● <html><body><table border="0" cellpadding="2"> <tr bgcolor="#a0a0a0"> <td>Nome</td><td>E-mail</td></tr> <?php $con = mysql_connect("", "", ""); mysql_select_db("banco", $con); $sql = "SELECT nome, email FROM contato"; $res = mysql_query($sql, $con); while ($row = mysql_fetch_array($res)) : ?> <tr bgcolor="#e0e0e0"> <td><?=$row[1]?></td><td><?=$row[2]?></td></tr> <?php endwhile; mysql_free_result($res); mysql_close($con); ?></table></body></html>

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 46

Pattern:Pattern:TemplatesTemplates

● O uso de mecanismos de templates permite criar páginas PHP contendo quase nenhum código (boas para web designers) ao mesmo tempo em que separa a lógica de negócios, crítica de dados e controle de fluxo de trabalho da aplicação em scripts que não contém código HTML, sendo portanto mais legíveis aos programadores

● O Pear contém dois mecanismos de templates chamados de “Flexy” e “Signa”

● A biblioteca Fast Templates é bastante popular● Podem ser utilizadas páginas PHP padrão

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 47

Exemplo:Exemplo:Template form.phpTemplate form.php

● <html><body><h1>Dados do Contato<h1><?= $msg ?><form><input type=”hidden” name=”id” value=”<?= $id ?>”>Nome: <input name=”nome” value=”<?= $nome ?>”><br>E-mail: <input name=”email” value=”<?= $email ?>”><br><input type=”submit” name=”gravar” value=”Ok”></form></body></html>

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 48

Exenplo:Exenplo:Script edita.phpScript edita.php

● <?php include “contato.php”; $msg = “”; if ($gravar) { if (trim($nome) == “”) $msg .= “Deve ser informado o nome<br>”; if (trim($email) == “”) $msg .= “Deve ser informado o e-mail<br>”; if ($msg == “”) { grava_contato($id, $nome, $email); header(“Location:”, “lista.php”); } else include “form.php”; } else { ($nome, $email) = le_contato($id); include “form.php”; }?>

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 49

Fluxo do ExemploFluxo do Exemplo

● A página lista.php fornece uma relação de contatos, onde cada um é um link para sua edição pela página edita.php

● Os dados do contato são lidos do banco e exibidos no formulário em form.php

● Ao click do botão submit, novamente a página edita.php é executada, verificando se ambos os campos foram fornecidos

● Estando tudo ok, voltamos para lista.php● Caso contrário, permanece no formulário

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 50

Fluxo do ExemploFluxo do Exemplo

lista.php edita.php

form.php

linkinclude

action

redirect

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 51

Anti-Pattern:Anti-Pattern:Interpretação RepetitivaInterpretação Repetitiva

● Executar um script PHP para recuperar dados de um banco, inserir suas informações em estruturas de dados, calcular somatórios, formatar valores e etc, é um trabalho dezenas de vezes mais intenso do que retornar uma simples página HTML

● Na maiora das vezes, o mesmo resultado é enviado para centenas ou milhares de clientes, afinal os dados subjacentes não mudam o tempo todo!

● Sites de gande volume não se podem se dar a luxo de executar o mesmo código PHP repedidas vezes, gerando na maiora das vezes o mesmo resultado

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 52

Pattern:Pattern:PHP CachePHP Cache

● Vários “otimizadores de PHP” adotam o princípio de salvar o resultado da execução de um script em cache (como um proxy reverso) evitando a re-execução da página PHP original

● O PEAR fornece classes para salvar em cache qualquer informação de um script PHP, desde variáveis (como resultados de consultas a banco de dados), trechos de código até scripts inteiros

● Desta forma o desenvolvedor possui controle fino sobre que partes de uma página devem ser re-geradas e quais podem ser reaproveitadas de visitas anteriores

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 53

Exemplo:Exemplo:PEAR Cache LitePEAR Cache Lite

● <?php // inicializa o cache require_once("Output.php"); $options = array( "cacheDir" => "cache/", "lifeTime" => 5 ); $objCache = new Cache_Lite_Output($options); // o resultado do script dentro do if // não será processado se estiverem cache if (!$objCache->start("starwars")) { gera_pagina(); // salva no cache $objCache->end(); }?>

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 54

Anti-Pattern:Anti-Pattern:Depuração ad-hocDepuração ad-hoc

● Como o interpretador PHP padrão não fornece um front-end para execução passo-a-passo dos scripts, desenvolvedores customam inserir comandos echo em seus scripts para verificar variáveis ou o fluxo de controle do código

● Entretanto, mesmo quando se tem o DBG instalado e um IDE com suporte a ele (como o PHPed), a depuração de código pela execução passo-a-passo e inspeção de variáveis é um processo manual, intensivo e não-reproduzível, que estimula a “mascaração” de problemas em vez de sua solução efetiva

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 55

Pattern:Pattern:Logging FrameworkLogging Framework

● Uma biblioteca de funções ou classes para logging, que possa ser ativada ou desativada on-the-fly por parâmetros da URL, coockies ou configurações do ambiente é um aliado valioso para identificação de problemas em ambientes de produção

● O processo de logging deve ter capacidade de classificação, para não gerar exceso de informações, e utilizar arquivos bem-definidos, em vez de poluir a página do usuário; e permitir o agrupamento das mensagens por data/hora, usuário, página e principalmente sessão HTTP

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 56

Pattern:Pattern:Testes UnitáriosTestes Unitários

● Testes unitários automatizados, conforme as práticas do Extreme Programming, garantem que bugs possam ser isolados em componentes funcionais da aplicação (classes, scripts) de modo objetivo, em vez de depender da intuição do programador

● Geram métricas efetivas de acompanhamento do cronograma e da qualidade do projeto

● Por serem re-executáveis de forma fácil a qualquer momento, impedem que modificações posteriores re-introduzam bugs ou prejudiquem outras funcionalidades da aplicação

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 57

Anti-Pattern:Anti-Pattern:Autenticação ad-hocAutenticação ad-hoc

● Autenticação de usuários em uma aplicação web é exemplo clássico de “reinvenção da roda”, afinal a maioria das necessidades de autenticação e controle de acesso são as mesmas em vários sites

● A maioria deles apresenta falhas quando não se inicia pela “página de login”, ou polui o código de todas as páginas com verificações de autenticação que não tem nada a ver com a lógica da aplicação

● Além disso, obriga conteúdo estático de um site a passar por scripts PHP, prejudicando a performance

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 58

Pattern:Pattern:Autenticação pelo ServidorAutenticação pelo Servidor

● Todos os servidores web do mercado possuem mecanismos de autenticação – no caso do Apache integrados com vários bancos de dados e serviços de diretórios – e de controle de acesso

● O uso dos mecanismos do servidor web permite que um usuário salve bookmarks em qualquer página da aplicação, sendo devidamente autenticado sem necessidade de código na aplicação

● Caso sua aplicação necessite de algum controle mais estrito do que o oferecido pelo servidor web, estenda e não superponha o mecanismo disponível

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 59

Parte IIIParte III

Padrões Clássicos paraSistemas de Informação e

Aplicações Web

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 60

Anti-Patters x PatternsAnti-Patters x Patterns

● False Three-Tier● Modelo de Classe E/R

● Document/View

● Verdadeiro Three-Tier● Classes de Ação,

DAOs e VOs● MVC

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 61

Programação em Três Programação em Três CamadasCamadas

● Busca separar os componentes funcionais de uma aplicação em três camadas distintas e independentes:

● Apresentação● Negócio● Persistência (Dados)

● Esta separação em teoria favorece a reutilização de componentes e a evolução da aplicação para suportar novas demandas dos usuários e novas tecnologias

● A separação dos componentes de cada camada em servidores distintos aumentaria a escalabilidade

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 62

Anti-Pattern:Anti-Pattern:Falso Three-TierFalso Three-Tier

● Frequentemente se confunde a arquitetura de uma aplicação web com uma arquitetura de aplicação em três camadas:

● Navegador web● Servidor Web● Banco de Dados

● Apesar de serem fisicamente três computadores distintos, estas três camadas não se refletem na organização da aplicação, pois a camada do meio contém lógica de formatação e de acesso a dados

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 63

Anti-Pattern:Anti-Pattern:Fake Three-TierFake Three-Tier

● É caracterizado por scripts PHP (ou em qualquer outra linguagem para SSS) que misturam lógica das camadas de apresentação, negócios e persistência

● Estes scripts não conseguem realizar o potencial de reutilização e escalabilidade do desenvolvimento em três camadas

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 64

Pattern:Pattern:Verdadeiro Three-TierVerdadeiro Three-Tier

● Uma aplicação real do desenvolvimento em três camadas para a web pressupõe a criação de componentes independentes em cada camada, que podem fisicamente estar hospedados no mesmo computador (servidor web) ou serem distribuídos em computadores distintos

● É possível obter este resultado pelo projeto cuidadoso de classes e templates de páginas em PHP, e aí sim obter os benefícios do paradigma

● O próprio uso de requisições HTTP, ou de SOAP, possibilita gerar componentes PHP distribuídos

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 65

Real Three Tier em PHPReal Three Tier em PHP

● A camada de apresentação é formada por páginas/scripts PHP com ou sem o uso de templates

● As camadas de negócios e persistência são formadas por classes PHP com responsabilidades bem-definidas, que serão vistas com mais detalhes mais adiante nos padrões DAO e Classes de Atividade

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 66

Anti-Pattern:Anti-Pattern:Modelo de Classes E/RModelo de Classes E/R

● A maioria dos analistas e projetistas de aplicações OO tem facilidade em modelar classes informacionais e seus relacionamentos, pela similaridade com modelos E/R do mundo de bancos de dados relacionais

● Entretanto estes desenvolvedores falham ao não modelar classes representando atividades do negócio, como transações, fluxos de trabalho, procedimentos operacionais e etc, pois estas classes não representam necessariamente informações salvas de modo persistente no banco de dados

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 67

Anti-Pattern:Anti-Pattern:Modelo de Classes E/RModelo de Classes E/R

● As classes de persistência incorporam a lógica de negócio, dificultando a futura expansão do sistema para incorporar novos processos de negócio...

● ...e impedindo o uso dos mesmos dados por outros sistemas da empresa (integração de sistemas)

● O erro principal decorre modelar objetos como dados, e não objetos segundo suas responsabilidades

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 68

Pattern:Pattern:Data Access Objects – DAOData Access Objects – DAO

● Um DAO é responsável por salvar e recuperar informações em um banco de dados ou outro meio persistente (arquivos XML, sistemas legados, etc)

● Não deve haver correspondência direta entre classes DAO e tabelas em bancos relacionais – objetos situam-se em nível de abstração maior!

● Em especial, operações sobre DAO atuam de uma só vez sobre vários registros ou entidades que estejam relacionados, em especial informações agregadas, como em registros mestre/estravo(ex: nota fiscal e detalhes dos produtos adquiridos)

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 69

Pattern:Pattern:Classes de AtividadeClasses de Atividade

● DAOs estão longe de modelar toda a lógica de negócios da aplicação, afinal eles lidam apenas com armazenamento e recuperação de dados

● Em vez de construir aplicações sobre operações de ler, gravar e remover, deve-se construir aplicações sobre operações de alto nível do negócio, como localizar produto, calcular preço, estimar prazo de entrega, mudar status de crédito para “aprovado”, etc

● As classes que fornecem estas operações representam transações, fluxos de trabalho, ou qualquer outra atividade viabilizada pela aplicação

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 70

Pattern:Pattern:Value Objects – VOValue Objects – VO

● Informações devem ser passadas entre classes DAO, classes de atividades e a camada de apresentação da aplicação de modo estruturado, não como valores string, numericos, datas, etc

● Entretanto, seria muito oneroso a um objeto em uma página HTML carregar todo o código relacionado com o banco de dados ou com processos de negócios

● Daí a necessidade de objetos leves, que permitem o tráfego de informações entre as várias camadas da aplicação

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 71

Three-Tier x ClassesThree-Tier x ClassesDAO, de Atividade e VODAO, de Atividade e VO

Apresentação

Negócio

Persistência

Página PHP

Classes deAtividade

DAOs

VOs

VOs

Banco de Dados

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 72

Three-Tier em PHP:Three-Tier em PHP:DAO e Classes de AtividadeDAO e Classes de Atividade

● A implementação do modelo clássico de três camadas em PHP consiste na definição de classes de atividade, cujos métodos são referenciados pelas páginas PHP da aplicação

● Cada classe de atividade manipula uma ou mais instâncias de classes DAO, que não são entretanto manipuladas diretamente pelas páginas PHP

● Instâncias de VO fazem a “cola” entre páginas PHP e classes de atividade, e entre classes de atividade e classes DAO

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 73

Anti-Pattern:Anti-Pattern:Document/ViewDocument/View

● Aplicações GUI são facilmente modeladas em torno de uma interface com o usuário e um formato de arquivo (ou tabelas em um BD), organizando a aplicação em torno de documentos e visualizações destes

● O problema com esta organização é que a inteligência sobre o que mudar nos documentos não deveria ser parte dos dados... (que podem necessitar sofrer outro conjunto de operações em um contexto diferente)

● ...e nem parte da visualização (que assim perde seu potencial de reutilização em diferentes aplicações)

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 74

Anti-Pattern:Anti-Pattern:Document/ViewDocument/View

● O resultado costuma ser lógica de negócio dispersa em subrotinas de tratamento de evento (GUI) ou scripts de processamento de formulários (Web)

● O que nasce como uma aplicação OO se degenera rapidamente no velho “código espagueti”

● Este anti-pattern se manifesta em aplicações web quando o mesmo script contém a formatação HTML da página resultante e a lógica de tratamento de formulários e QUERY_STRING

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 75

Pattern:Pattern:Model-View-ControllerModel-View-Controller

● Na verdade, o anti-pattern Document/View é uma versão degenerada do padrão MVC:

● Model: Dados da aplicação e operações possíveis sobre esses dados, incluindo as regras de negócio

● View: A forma de apresentar estes dados para o usuário● Controller: Como interpretar ações do usuário

(eventos) e seu mapeamento em operações sobre os dados

● A aplicação eficiente do MVC passa pelo reconhecimento de que M e V são reutilizáveis, C é específico para cada aplicação

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 76

MVC, Templates, Scripts e MVC, Templates, Scripts e Classes PHPClasses PHP

Visualização

Controlador

Modelo

Template PHP

Script PHP

Classes deAtividade

VOs

VOs

DAOs

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 77

MVC em PHPMVC em PHP

● Observe que a implementação do padrão MVC em PHP consiste principalmente na separação entre:

● Templates (ou páginas PHP com esta função) e● Scripts “estilo CGI”, que são referenciados pors links e

formulários – nunca uma URL referencia diretamente o template!

● A camada Model é projetada segundo os padrões já vistos para o desenvolvimento em três camadas

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 78

Three Tier x MVCThree Tier x MVC

● Note que Apresentação (Three-tier) tem signficado (e abrangência) bem diferente da Visualização (MVC):a primeira refere-se a toda a interface com o usuário, e assim inclui também o Controlador

● De modo inverso, o Modelo (MVC) tem escopo maior do que a Persistência (Three-tier), pois ele inclui as regras de negócios, não apenas a capacidade de ler e gravar dados

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 79

Three Tier x MVC x PHPThree Tier x MVC x PHP

Apresentação

Negócio

Persistência

Visualização

Controlador

Modelo

Template

Script PHP

C. Atividades

DAOs

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 80

Além dos padrõesAlém dos padrões

● PHPUnitFramework para a confecção, execução e tabulamento de testes de unidade segundo a metodologia XP

● PHPDocGeração automatizada de documentação para classes e scripts PHP, emulando o padrão JavaDoc

● Poseidom UMLVersão comercial do ArgoUML, ferramenta escrita em Java e baseada no padrão XMI do OMG/W3C, com capacidade de gerar código SQL e PHP para modelos UML

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 81

FIMFIM

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 82

ReferênciasReferências

● Design Patterns e Anti-Patterns● www.cmcrossroads.com/bradapp/docs/patterns-

intro.html● www.patterndepot.com/put/8/JavaPatterns.htm● www.amazon.com/exec/obidos/ASIN/0471197130/thean

tipatterngr/002-8176613-0396864● Design Patterns em PHP

● www.devarticles.com/art/1/560● www.zend.com/zend/trick/tricks-app-patt-php.php● www.horde.org/papers/kongress2002-design_patterns/

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 83

ReferênciasReferências

● Sobre o PHP e o PEAR● www.pnp.net● pear.php.net

● Sobre o PEAR Cache_Lite● www.devshed.com/Server_Side/PHP/PHP_Cache_Lite/

print_html

© 2003 Fernando Lozano, http://www.lozano.eti.br Patterns e Anti-Patterns para PHP Pag. 84

PerguntasPerguntas

● Dúvidas:[email protected]

● Palestra e atualizações:www.lozano.eti.br

● Livro:Java em GNU/Linuxwww.altabooks.com.br