Escolar Documentos
Profissional Documentos
Cultura Documentos
Artigo2012 Javamagazine107 PadroesProjetoWeb
Artigo2012 Javamagazine107 PadroesProjetoWeb
CLÁUDIO MARTINS
Padrões de projeto são boas soluções aplicadas a boa parte de problemas comuns em um determinado
contexto. É uma abordagem para o desenvolvimento de software baseado no reuso de idéias e soluções
genéricas, mas que devem ser contextualizadas para problemas específicos.
As principais características são: (a) criam uma linguagem compreendida por todos; (b) facilitam a
mentalização da solução; e, (c) são propostas em alto nível (sem detalhes de implementação) para
problemas recorrentes.
Apesar de terem sido criados inicialmente para solucionar problemas encontrados em projeto (design)
de software orientado a objetos, o conceito se estendeu para outras preocupações da Engenharia de
Software. Há padrões identificados para a análise de negócio, para transformação de código
(refatoração), para projeto de banco de dados, para interfaces web, enfim, onde é possível identificar e
catalogar boas soluções que são frequentemente aplicados, haverá padrões de projeto.
Este artigo apresenta a abordagem de padrões de projeto no contexto do desenvolvimento de aplicações
web, e discute a importância de se documentar e organizar os padrões em catálogos, ação que promove a
sistematização dessa abordagem em um processo de construção de aplicações web.
2
Definição
Os padrões de projeto surgiram de um conceito criado pelo arquiteto Christopher Alexander, em sua
obra "The Timeless Way of Building", de 1979. O autor propôs que cada padrão é uma regra com três
partes, que expressa a relação entre contexto, problema e solução.
Cada padrão é um relacionamento entre um certo contexto, um certo sistema de forças que ocorre repetidamente
nesse contexto (problema), e uma certa configuração (solução) que permite que essas forças se resolvam.
Essas três partes, além do próprio nome do padrão, formam a essência da documentação de um padrão:
a) O Contexto: se refere ao conjunto de situações que se repetem, nas quais o padrão de projeto pode
ser aplicado;
b) O Problema: que trata do conjunto de "forças" – objetivos e limitações – que ocorrem dentro do
contexto;
c) A Solução: que é uma estrutura formal para ser aplicada na resolução do problema.
A primeira iniciativa em aplicar padrões no desenvolvimento de software veio com a publicação do
livro de Erich Gamma e três colaboradores (Helm, Johnson e Vlissides), intitulado "Design Patterns:
Elements of Reusable Object-Oriented Software" (1995), onde os autores identificaram 23 padrões para
projeto orientado a objetos. Esses padrões formam a base para a maiorias dos padrões que tratam de
problemas em projetos dessa natureza, como o catálogo de padrões Blueprints, também chamados de
Core J2EE Patterns.
Catálogos de Padrões
A importância de padrões de projeto aumenta quando os padrões são documentados em um repositório
ou biblioteca, também denominados catálogos. A adoção de catálogos de padrões é uma forma efetiva de
documentar e compartilhar soluções para problemas recorrentes de projeto, facilitando o reuso dessas
soluções e ajudando a manter certa consistência no projeto. Além disso, melhoram a eficiência do
processo de desenvolvimento e aumentam a produtividade dos designers por reduzir o retrabalho de
pesquisa de boas soluções, minimizando a prática da "reinvenção da roda".
Embora padrões sejam soluções de projeto independente de questões de implementação, há muitos
benefícios para equipes de desenvolvimento pelo uso de componentes de software que suportem e
instanciam padrões de projeto. Depois que um padrão é escolhido, equipes podem reutilizar e adaptar os
componentes e trechos de código (como templates) para implementar um determinado padrão
selecionado, reduzindo o tempo gasto no desenvolvimento de aplicações web. A eficiência de reuso é
melhor obtida quando um catálogo permite relacionar os padrões (por dependência) e identificam quais
componentes incorporam esses padrões de projeto. Por exemplo, a implementação do padrão Front
Controller pode necessitar do padrão Command, dessa forma o desenvolvedor terá mais facilidade em
construir o código a partir do momento que conhece todos os padrões envolvidos na solução.
A maior dificuldade em catalogar um padrão é saber realmente se o padrão é um “padrão de fato”. Há
uma discussão entre especialistas no tema em identificar o que é padrão e o que é antipadrão (aquele que
parece ser uma boa solução mas conduz a práticas improdutivas e ineficientes). Um exemplo em
aplicações web é o padrão “Tela de Splash”, aquela página “pop-up” que abre automaticamente no início
de uma homepage; para alguns autores é considerado um antipadrão, pois contraria a heurística de
prover feedback ao usuário ou de antecipar sobre o que pode ocorrer na aplicação.
Outra dificuldade encontrada para adoção de padrões de projeto e uso de catálogos é o pouco consenso em definir
o que é um padrão, estabelecer um nome e os limites do seu contexto (para o qual ele foi definido). Muitos padrões
são semelhantes entre si, mas possuem denominações diferentes, dependendo de quem documentou e registrou;
atuam em contextos complexos que dificultam a sua aplicabilidade. Um bom padrão é aquele que, a partir do seu
nome, qualquer desenvolvedor consiga entender e aplicar.
3/
Mesmo com todas as dificuldades em adotar catálogos de padrões, o seu emprego deve ser encorajado
em organizações que desenvolvam grandes projetos, possuam equipes com muitos membros, ou que
seus membros estejam distribuídos geograficamente. Um catálogo ajuda a manter a consistência e
coerência no projeto, além da consequente qualidade que se obtém na arquitetura do software.
Na web encontramos alguns catálogos de padrões de projeto, em destaque há uma prevalência por
catálogos de padrões para tratar problemas de interface, interação e navegação em aplicações web.
Exemplos como Welie.com e UI-patterns.com, mantidos pela comunidade de designers; o do livro de
Jennifer Tidwell (2010) denominado "Designing Interfaces: Patterns para Design de Interação Efetiva".
Outro catálogo de relevância é o Yahoo! Design Pattern Library, um catálogo de padrões web com
mais de 50 padrões documentados e organizados em categorias (ver Figura 1).
A classificação dos padrões é uma decisão de quem mantém o catálogo de padrões, não
necessariamente segue a mesma classificação listada aqui. Para exemplificar, o Yahoo organiza o seu
catálogo em cinco grandes categorias de padrões: Layout, Navegação, Seleção, Interação Rica e Design
Social, cada uma está dividida em coleções especializadas. O mesmo ocorre com outros catálogos
online, como o Welie, que organiza o seu catálogo em: Necessidade do Usuário (padrões que atendam a
uma necessidade direta do usuário), Necessidades de aplicação (padrões que ajudam a aplicação, ou o
designer, se comunicar melhor com o usuário), e Contexto do design (diz respeito a padrões de
estruturação do conteúdo e do projeto do site).
Para exemplificar alguns dos padrões para aplicações web, este artigo apresenta dois padrões JEE
(Front Controller e Command), e dois de interação e apresentação visual (Paginação e Carrinho de
Compras). Para efeito de demonstração do formato de documentação, recomendado para registro em um
catálogo, adotamos o formato mínimo para o primeiro padrão (Front Controller); nos padrões seguintes
adotamos uma apresentação mais livre de formalismo.
Problema
Deseja-se um ponto de acesso centralizado para processamento de todas as requisições recebidas pela
camada de apresentação para: (a) controlar a navegação entre os objetos de visão; (b) remover
duplicação de código; e, (c) estabelecer responsabilidades mais definidas para cada objeto, facilitando
manutenção e extensão.
O acesso de páginas clientes sem passar por um mecanismo centralizado, pode dificultar o controle de
navegação e segurança da aplicação, pois uma página pode ser aberta por alguém que não deveria ter
acesso. Outro problema recorrente em aplicações desse tipo é o existência de código de controle
duplicado e misturado ao código de apresentação.
Solução
No cenário "b" (Figura 2), o Front Controller delega processamento a um objeto de apoio (Helper).
Nessa solução, pode-se aplicar padrões como Command, Value Beans, e outros onde a competência
para realizar a operação é decidida.
5/
Padrão "Command"
O padrão Command separa o mecanismo que trata a solicitação (request) do serviço que realiza a
tarefa a ser executada.
Command (no contexto de aplicações web) é uma adaptação do padrão de Gamma et al. (1995) como
estratégia de implementação do Front Controller. É um padrão que pode ser implementado em
aplicações web na forma mais simples, até à mais elaborada. Para aplicações que adotam Servlets, por
exemplo, uma solução simples é tratar o comando que vem na solicitação, enviado com parâmetro na
solicitação, normalmente chamado de action ou comando. Esse parâmetro que informa a ação do
comando contém um de vários valores das tarefas a serem executados na aplicação. O servlet de controle
recupera o valor da ação como parâmetro da solicitação, e determina qual a lógica de negócio deve ser
executado pelo objeto Command . A definição desse padrão no catálogo JEE de padrões é realizada pelo
padrão "Service to Worker". A Figura 3 mostra um exemplo simplificado de Command para uma
calculadora que deve executar operações para somar, subtrair, multiplicar e dividir dois números. O
código dessa solução é visto na Listagem 2 (a interface de Command) e na Listagem 3 é mostrada as
classes controladora e de implementação do Command.
@Override
public String execute() {
// tratar a requisicao
float n1 = Float.parseFloat(this.getRequest().getParameter("n1"));
float n2 = Float.parseFloat(this.getRequest().getParameter("n2"));
String acao = this.getRequest().getParameter("acao");
float result = 0;
if (acao.equalsIgnoreCase("SOMAR")) {
result = n1 + n2;
}
if (acao.equalsIgnoreCase("SUBTRAIR")) {
result = n1 - n2;
}
// outras ações
// gets e set´s
} // Fim da classe
// Classe controladora
@WebServlet(name = "ControladorCalc", urlPatterns = {"/ControladorCalc"})
public class ControladorCalc extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Padrão "Paginação"
Paginação é um padrão para projeto de interação de interface com usuário. É indicado quando o
usuário necessita visualizar um subconjunto de dados que não serão fáceis de mostrar dentro de uma
única página. Esse problema é solucionado com a adição de um mecanismo de paginação, normalmente
uma barra que permite navegar entre as páginas que são geradas como resultado da paginação. Um
exemplo bem conhecido é a lista de resultados de uma pesquisa do Google, como é visto na Figura 4.
7/
Note que a solução deve prover meios para: a) quebrar a lista de itens em uma seqüência de páginas; b)
fornecer links para acessar tanto as páginas anteriores, quanto as próximas em relação à página que está
sendo exibida; c) fornecer links para saltar para a primeira e última páginas do conjunto; d) destacar qual
o número da página que o usuário está navegando.
A instanciação do padrão Paginação, quando se desenvolve aplicações web com Java Server Faces
(JSF), quase sempre é resolvido com o uso de componentes baseados em tag library. Um exemplo é o
componente dataScroller do RichFaces, como pode ser visto na Listagem 4 e renderizado como na
Figura 5. Neste exemplo, um conjunto de dados é tabulado a partir da coleção registrada no bean
gerenciado (cidadeMB.cidades), o componente <rich:dataScroller> trabalha em colaboração com o
componente <rich:dataTable>, onde se especifica o número máximo de itens a serem exibidos em cada
paginação (rows="4").
<rich:column>
<f:facet name="header">
<h:outputText value="FRETE" />
</f:facet>
<h:outputText value="#{cid.valorFrete}"/>
</rich:column>
<f:facet name="footer">
<rich:dataScroller renderIfSinglePage="true" />
</f:facet>
</rich:dataTable>
public CarrinhoBean() { }
Conclusões
Padrões de Projeto é uma técnica de reuso de software que oferece benefícios práticos no
desenvolvimento de aplicações web, tais como prover soluções de projeto de forma consistente, orientar
equipes de desenvolvimento com diretrizes e boas práticas, melhorar o processo de comunicação com a
adoção de uma linguagem comum de padrões, entre outros. Entretanto, para atingir esses benefícios é
importante que os padrões de projetos estejam documentados e disponíveis em um formato que promova
o reuso. Várias coleções de padrões estão documentadas e disponíveis na Web, normalmente em forma
de bibliotecas ou catálogos, como é o caso de Welie (http://www.welie.com) e Yahoo! Design Pattern
Library (http://developer.yahoo.com/patterns/).
Apesar da popularidade de padrões e dos catálogos de padrões, atualmente não há um consenso em
como os padrões deveriam ser documentados, mantidos e compartilhados por todos. Contudo, é inegável
a importância de utilizar padrões de projeto para orientar as decisões por melhores soluções para
problemas que recorrentemente ocorre nos projeto de aplicações, em especial as disponibilizadas na
web.
Links
http://developer.yahoo.com/ypatterns/
Catálogo do Yahoo! Design Pattern Library
http://www.welie.com/
Catálogo com mais de 130 padrões de interação web.
http://ui-patterns.com/
Catálogo com 58 padrões de projeto de interface web, agrupados em cinco categorias.
http://java.sun.com/blueprints/corej2eepatterns/index.html
Catálogo dos padrões JEE (Blueprints, Core J2EE Patterns)
Livros (opcional)
Padrões de Projeto: Soluções Reutilizáveis de Software Orientado a Objetos; Gamma, Helm, Johnson e
Vlissides; Artmed, 2000.
Primeiro livro a abordar o assunto, apresenta um catálogo com 23 padrões para solucionar problemas de design orientado a
objetos.
Web Application Design Patterns (Interactive Technologies); Pawan Vora; Morgan Kaufmann Publishers,
2009.
Apresenta uma coleção com mais de cem padrões documentados para design de aplicações web.
Cláudio Martins (claudiomartins2000@gmail.com) é Mestre em Computação pela UFRGS, professor do Instituto Federal do Pará (IFPA)
e analista de sistema da Companhia de Informática de Belém (Cinbesa). Trabalha há dez anos com a plataforma Java.