TCC Artigo

Propaganda
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)
Download