Padrões de Projetos aplicados a WEB utilizando PHP Paul A.J. Braam Vrije Universiteit van Amsterdam Faculty of Sciences Department of Computer Science stud.nr. 1123270 [email protected] Abstract. Design is important and can be very usefull in web programming in PHP. I got interested in solving programming problems by applying patterns to PHP. Applying general OO-patterns to PHP is not always as easy as it seems to be. I adapted three such patterns for PHP: Singleton, Stragegy and Model View Component(MVC). I also introduce another pattern that I wrote specially for PHP: SessionObject. Resumo. O projeto é importante e pode ser muito utilizado na programação web em PHP. Eu comecei interessado em resolver problemas de programação aplicando padrões a PHP. Aplicar Orientação a Objeto (OO) a PHP não é sempre tão fácil como parece ser. Eu adaptei três destes padrões para PHP: Singleton, Stragegy e Model View Component (MVC). Eu introduzo também um outro padrão que eu escrevi especialmente para PHP: SessionObject. 1. Informações Gerais O formato deve ser A4, em uma coluna, com margem superior de 3,5cm, margem inferior de 2,5cm e para as margens esquerda e direita, 3cm, sem cabeçalhos e rodapés. A fonte deve ser Times, tamanho 12, normal, com 6 pontos de espaço antes de cada parágrafo. Os números de páginas não deverão constar na versão final. O número total de páginas deve ficar entre 18 e 25. 1. Introdução Há alguns anos eu fiz muitos trabalhos de programação web (em PHP). Ao programar enfrentei muitos problemas. Naturalmente era loucura criar soluções para estes problemas, eu mesmo buscava a maioria de programadores da web, que também enfrentarão os mesmos problemas e nós não queremos reinventar a roda repetidas vezes. A solução para este problema é padrões. Observei que há muito trabalho a fazer em padrões para a web, especialmente programando em PHP. Há alguns locais que fornecem padrões para PHP, mas a maioria deles são de má qualidade. Eu encontrei muitos erros de projeto e implementação, naqueles padrões. Antes de uma curta introdução aos padrões de projeto, esclarecerei porque o projeto no general é importante para a programação web. Após a introdução a padrões de projeto, quero indicar alguns problemas de programação web, e em relação àqueles problemas, darei alguns exemplos de como os padrões de projeto podem ser usados para solucioná-los. 2. Sobre PHP PHP Hypertext Preprocessor. É uma linguagem em forma de script e de código aberto. A versão atual (PHP4) limita o desenvolvimento da programação orientada a objeto. Suporta definição de classe, funções membro, e inheritance (quando uma subclasse recebe variáveis ou métodos da superclasse). Mas não suporta múltiplo inheritance e real encapsulamento (porque os atributos não podem ser definidos confidencialmente). Também o suporte ao polimorfismo está em sua essência. Com a introdução da versão 5 mais problemas serão resolvidos. 3. PHP e projetos Antes de falar sobre padrões de projeto, devemos ver no que um bom projeto pode lhe oferecer. Algumas pessoas pensam que nunca devem usar objetos porque farão funções e páginas simples. Para algumas situações isto é verdadeiro, mas em outro você pode querer um nível de abstração mais elevado. Estão aqui algumas características que um bom projeto pode lhe oferecer. Um bom projeto pode aumentar as seguintes propriedades: Legibilidade; Reusabilidade; Simplicidade; Modularidade; Portabilidade; Adaptabilidade; Maintainability; Extendibilidade. Como você pode imaginar a maioria destas características são muito importantes para as aplicações web maiores que de algumas páginas. 4. Introdução para padrões de projeto Os padrões de projeto são escritos descrevendo soluções aos problemas comuns do projeto. Um padrão de projeto consiste nos seguintes elementos: Nome usado para identificar o padrão Problema que problema é atacado com este teste padrão? Contexto em que contexto este padrão deve ser aplicado? Solução & Conseqüências a solução para o problema indicado e suas conseqüências 5. Camadas na programação web Webprogramming consiste em muitas camadas. Estas são: interação homemcomputador, projeto de interface, projeto de informação, scripting, desenvolvimento das bibliotecas, projeto da base de dados. É bom saber que em cada camada o padrão de projeto tem que ser aplicado. Tais padrões são de linguagem ou domínio específico. Os padrões de projeto que residem na camada scripting naturalmente serão mais de uma linguagem específica do que de uma que resida na camada do projeto de interface com usuário. 6. Problemas de programação da web comum Apresentações múltiplas: A maioria das aplicações web estão acessíveis através da Internet. Isso significa que pessoas do mundo inteiro podem acessar estas aplicações. Freqüentemente oferecem apresentações múltiplas da mesma aplicação. Com isso vemos a necessidade de internacionalizar e localizar um web site, que exige suporte a diferentes línguas, moedas correntes. Navegação: Um dos aspectos mais importantes no projeto web, é o projeto de navegação e de informação. Os usuários necessitam sempre ter conhecimento de sua localização dentro de um web site. Operações da base de dados: É muito importante pensar sobre como você está utilizando essa base de dados; também como você está acessando. Por exemplo: colocar seu SQL-queries diretamente na página PHP. Se a estrutura da base de dados mudar, você tem que manualmente atualizar todas as queries separadas nas diferentes páginas PHP. Autenticação, sessões, etc.: Seguir usuário ou sessão foi feito para fornecer Web sites personalizados para o usuário. Desde que a introdução de PHP4 diversas funções padrões para automatizar a autenticação e a sessão. 7. Padrões de projeto para a web em PHP 7.1 Padrão Singleton Nome: Singleton Problema: Você precisa de uma instância global de uma classe e um ponto global de acesso a ele. Contexto: Qualquer um Solução & conseqüências: Fazer uma variável estática encapsulada que prende a única instância de uma classe. Fornecer um método-get que: Tenha uma variável estática para prender esse e a única instância; Instanciar a instância se esta já não existir; Retornar a instância; Este método retorna somente uma instância da classe. Assim ganha-se muito em desempenho. O padrão singleton impede a aplicação gere muitos objetos desnecessários, o que resulta em um ganho de desempenho. Implementação: Há alguns problemas com a implementação do padrão singleton em PHP: Em PHP4 não é possível definir variáveis estáticas numa classe. Mas nós definitivamente precisamos de uma variável estática para armazenar a instância. Felizmente podemos definir variáveis estáticas em uma função. PHP não suporta métodos estáticos mas a versão a mais recente PHP4 você pode apenas chamar um método como este: class::method(). 7.2 Padrão Strategy Nome: Strategy Problema: Você precisa de diversas estratégias diferentes que resolvam o mesmo problema para facilmente serem permutáveis uma com a outra. Por exemplo, um Web site com suporte para múltiplas línguas e moedas correntes. Contexto: Qualquer um Solução & conseqüências: Solução: Criar uma superclasse (Strategy) que seja usada como uma relação compartilhada para as classes concretas de estratégias. Definir uma subclass (ConcreteStragegy) para cada estratégia que necessite, sobrepondo a função membro da superclasse. Criar uma referência em sua aplicação PHP a uma subclasse (a estratégia concreta que você precisa) e utilize esta referência durante todo seu programa. A conseqüência é que na aplicação PHP você pode trocar livremente a referência de uma subclasse para outra. Figura 1. Diarama UML 7.3 Padrão Model View Controller (MVC) Nome: Model View Controller Problema: Você quer muda a aparência de sua aplicação web de tempos em tempos, ou você quer oferecer diversas aparências para a mesma aplicação de maneira fácil. Contexto: Mudança ou diversas aparências para a mesma aplicação Solução & conseqüências: Dividir sua aplicação em 3 partes: Model (Processo): é uma representação dos dados e das operações nele possíveis. View (saída): reproduz uma visão do conteúdo do model. Controller (entrada): traduz interações com a view para ações a serem executadas pelo model. 7.4 Padrão SessionObject Todos os padrões anteriores são projeções de padrões existentes em PHP. Em geral os padrões são adaptados para serem utilizados em PHP. Nome: SessionObject Problema: Ao programar uma aplicação web, fazendo uso de sessões e quiser lembrar a informação sobre a sessão (durante toda a sessão) de maneira organizada e estruturada. Guardar o conteúdo da cesta de compras, mantendo-a disponível do começo até ao fim da sessão em um site de compras. Contexto: Aplicações Web com sessões. Informação de sessão tem que estar disponível durante toda a sessão. Solução & conseqüências: Criar uma definição de classe que represente a informação que precisa para estar disponível durante toda a sessão. No alto de cada PHPpágina: Começar ou continuar uma sessão; Registrar uma variável da sessão (para prender o objeto da sessão); Verificar se existe um objeto da sessão, se não, criar uma instância da classe e atribuir à variável da sessão. Agora você pode sempre alcançar a informação da sessão em uma maneira organizada (através de um objeto) e esse objeto estará disponível durante a sessão inteira. Normalmente os objetos em PHP não duram muito tempo, porque existem somente durante o processamento das páginas. Quando você chama uma página, os objetos são criados e são usados para processar a página. Depois que o resultado foi emitido para o usuário, todas as variáveis, incluindo os objetos, estarão perdidas. Com este padrão você registra um objeto como uma variável da sessão. Isso significa que, após processar a página, o objeto estará armazenado em um arquivo texto juntamente com o resto da informação da sessão. 8. Combinando Problema e Padrão Nesta seção quero combinar os problemas a alguns padrões importantes. Múltiplas apresentações: O padrão Model View Controller (MVC). Navegação: Não é tipicamente um problema de PHP. Operações da base de dados: Adaptador padrão das operações da base de dados, adaptador padrão é fácil de projetar sobre PHP. Autenticação e sessão: Padrão SessionObject. 9. Conclusão Estes problemas são principalmente devido ao fato que PHP não é uma verdadeira linguagem orientada a objeto e que a maioria dos padrões são orientados a objeto. Assim nós podemos concluir que os padrões dependem da expressividade da linguagem. No futuro será mais fácil traçar padrões (OO) a PHP porque com a introdução de versões mais novas com suporte a OO em PHP serão amadurecidas. É importante saber que os padrões não têm que ser orientados a objeto. Porque os criadores dos padrões, os escreveram para OO, algumas pessoas pensam que os padrões estão relacionados sempre a OO, mas isto não é verdade; por exemplo padrões para programação estratégica funcional. Eu penso de que estes quatro padrões são muito úteis aos programadores PHP. Há anos atrás, eu fazia meus próprios programas em PHP, mas nunca tinha visto algum destes padrões, se tivesse visto estes padrões neste tempo, teria ganhado muito tempo com figuração, fora que era a melhor solução a um dado problema. 10. Referências Erich Gamma, Richard Helm,Ralph Johnson, and John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software, Addison Wesley (1994). G. Rossi, D. Schwabe and A. Garrido. Design Reuse in Hypermedia Applications Development, Proceedings of ACM International Conference on Hypertext (Hypertext97), ACM Press (1997). Michael J. Flynn. Introduction to â€Influence of Programming Techniques on the Design of Computer―, Proceedings of the IEEE, VOL. 85, NO. 3, March 1997. A. Garrido, G. Rossi, and D. Schwabe. Patterns Systems for Hypermedia, Proceedings of PloP97 (1997), Available at: http://st-www.cs.uiuc.edu/users/hanmer/PLoP97.html F. Lyardet, Gustavo Rossi and D. Schwabe. Patterns for Dynamic Websites, Proceedings of PloP98 (1998), Available at: http://jerry.cs.uiuc.edu/ plop/plop98/ G. Rossi D. Schwabe F. Lyardet. Improving Web Information Systems with Navigational Patterns, Available at: http://www8.org/w8-papers/5b-hypertextmedia/improving/improving.html J. Conallen. Building Web Applications with UML, Addison-Wesley (2003) J. Lam. Introduction to Design Patterns Using PHP, (2003), Available at: http://www.devarticles.com/c/a/PHP/Introduction-to-Design-Patterns-Using-PHP/ The Hypermedia Design Patterns http://www.designpattern.lu.unisi.ch/ L. Repository Website, atkinson. Applying patterns to PHP, (2001), http://www.zend.com/zend/trick/tricks-app-patt-php.php Available at: Available at: The phpPAtterns Website, Available at: http://www.phppatterns.com/ The official PHP Website, Available at: http://www.php.net/ T. Converse, J. Park. PHP Bible 2nd Adition, John Wiley & Sons (2002)