Notícias
Design Patterns

Elaine Quintino Silva Elaine Quintino Silva
Minibio

Doutora e mestre em Ciência da Computação pelo ICMC-USP (São Carlos). Trabalha com a linguagem Java há 10 anos, aplicando inicialmente em projetos de pesquisa na área de informática na educação.

Atualmente trabalha na Globalcode com instrutoria, ministrando aulas e preparando material didático, e com desenvolvimento de software utilizando diversas tecnologias Java.


Elaine no Globalcoders Elaine no Twitter
Certificações

SCWCD, SCJP 1.5 e SCJA

Logo Core Patterns

Aborda o assunto design-patterns de forma teórica, prática e objetiva. São apresentados 33 design-patterns das famílias GoF e Java EE.


Logo Hands-on Patterns

O aluno aprende a utilizar os principais componentes do Java EE 5 de forma integrada e estruturada, aplicando design patterns e boas práticas de desenvolvimento.

29/04/2009

1 - O que são Design Patterns e que benefícios eles trazem para o software?

O termo Design Patterns (padrões de projeto) foi criado originalmente por um Engenheiro Civil (Christopher Alexander) para documentar os padrões mais comuns usados na construção civil. Mais tarde, o termo passou a ser utilizado na área de informática como forma de descrever soluções para problemas encontrados no projeto de software orientado a objetos.

Os padrões de projeto descrevem, de forma conceitual, como um problema em particular pode ser resolvido. Essa descrição é em relação à organização das classes da aplicação. Ao utilizar um padrão de projeto, devemos construir as classes da nossa aplicação seguindo o modelo definido no padrão. Por isso, os Design Patterns não são presos a uma linguagem de programação em particular. Um mesmo padrão pode ser utilizado em C++, Java, SmalTalk, C#, etc.

Um padrão de projeto contém a descrição do problema, a solução conceitual e pelo menos um exemplo de implementação, além de outros detalhes.

O uso de padrões de projeto traz inúmeros benefícios para um software. Podemos citar:

  • a facilidade de comunicação, uma vez que os padrões de projeto trazem um vocabulário comum (dizer que estamos usando DAO já explica como é a organização das classes de acesso ao banco);
  • a manutenibilidade, já que os padrões prezam o baixo acoplamento entre as classes e a alta coesão, de forma que extensões e alterações possam ser feitas sem grandes traumas.
  • a organização do projeto como um todo, já que os design patterns defendem a "padronização".

2 - Como eu posso identificar a necessidade de usar um design pattern em meu software?

Bom, primeiramente, para usar um padrão de projeto é necessário identificar um problema. Se sua aplicação não tem problema, não há porque usar o padrão. É bom ressaltar que o uso dos padrões aumenta a complexidade do software inicialmente, sendo que seus benefícios só serão percebidos quando for necessário fazer manutenções. Portanto, usar padrões apenas por usar pode trazer mais problemas.

Você pode identificar problemas quando você começa a repetir código, quando a alteração ou adição de uma determinada funcionalidade requer muitas mudanças no código existente, quando uma classe está ficando muito grande ou com muitas responsabilidades. Esses são bons indicadores de que sua aplicação necessita de um padrão. Aí é só buscar o Design Pattern que resolve o problema identificado em um dos catálogos disponíveis.

3 - Frequentemente ouvimos as palavras catálogo de padrões e frameworks relacionadas com o termo Design Pattern. Poderia explicar como funcionam essas relações?

Catálogo de padrões é apenas um nome para uma família de padrões. Existem dois grandes catálogos de padrões: GoF e Java EE. Os padrões GoF (Gang of Four) foram documentados em um livro por quatro amigos com base nas suas experiências de trabalho em vários projetos. Esses padrões são totalmente desvinculados de uma linguagem em particular. Neste catálogo, para cada padrão há um exemplo de implementação usando SmalTalk e C++. Já o catálogo Java EE descreve padrões mais vinculados à tecnologia Java e descrevem soluções para problemas de software desenvolvido usando componentes Java EE. Os exemplos oferecidos nesse catálogo são sempre com linguagem Java. Porém, isso não quer dizer que não possamos implementar esse padrão com outras linguagens, mesmo porque, muitos deles são especializações dos padrões GoF para tecnologias Java.

Os frameworks são definidos como aplicações semi-completas que podem ser extendidas e customizadas. A caracterítica de extensibilidade dos frameworks é possível graças à aplicação de vários padrões de projeto que buscam o desacoplamento entre as classes e a criação de pontos de extensão. Por meio desses pontos de extensão, o desenvolvedor customiza sua aplicação acrescentando funcionalidades sem a necessidade de alterar o núcleo do framework. Em outras palavras, frameworks são uma junção de padrões de projeto para permitir acresentar novas funcionalidades da maneira mais simples, partindo de uma arquitetura pré-definida.

4 - Considerando as tecnologias atuais, os Design Patterns ainda são relevantes?

Com certeza. Com os novos frameworks, como JSF, Spring, JBoss Seam, e muitos outros, alguns design patterns acabam sendo questionados, como o caso do Singleton, DAO, entre outros, que não vou entrar em detalhes.

O fato é que alguns padrões podem sim ser utilizados independente da tecnologia, pois eles resolvem problemas também independentes de tecnologia, por exemplo: Adapter, FactoryMethod, AbstractFactory, Composite, entre outros, que mesmo usando tecnologias atuais, podem ser muito úteis.

5 - Quais seriam os principais mitos relacionados com Design Patterns?

Há alguns mitos como:

  • Quanto mais Design Patterns eu utilizar na minha aplicação, melhor ela será?

    A resposta é NÃO. Eles só devem ser utilizados se há um problema que justifique o seu uso. Caso contrário, você só tornará seu código mais complicado.

  • Design patterns são soluções para os problemas de orientação a objetos?

    A resposta também é NÃO. Eles descrevem a solução de forma conceitual. Você tem que escrever o código. No máximo, os catálogos descrevem exemplos de código para cada padrão.

6 - Poderia citar algumas referências de livros ou sites onde se pode aprender Design Patterns?

A referência principal é o livro do GoF, "Padrões de Projeto - Soluções reutilizáveis de software orientado a objetos", Gama, E. et al. Esse livro descreve 23 padrões e usa exemplos de código em SmalTalk e C++, mas os exemplos são todos voltados para interfaces gráficas tipo Swing.

Outra referência é o livro "Design Patterns Java Workbook", Steven Metsker, ed.Addison Wesley, que tem os 23 patterns do GOF com exemplos em Java, embora alguns não sejam tão bons porque são forçados para um único aplicativo (fábrica de jogos de artifício).

Há também o livro "Design Patterns Explained: A new perspective on Object-Oriented Design" de Alan Shalloway James R. Trott, ed. Addison Wesley. Neste livro não há todos os patterns, mas tem exemplos melhores baseados em experiências pessoais dos autores.

Por fim, um maneira mais simples de conhecer todos os padrões é no curso CorePatterns da Globalcode. Neste curso ensinamos os 23 design patterns do GoF e 10 design patterns do Java EE sempre com exemplos de implementação, laboratórios práticos (com refactoring de classes baseadas nos padrões) e muitas discussões sobre vantagens, desvantagens, onde usar, onde não usar, etc.