Padrões de Projetos – Introdução

Olá pessoal, um dos temas mais recorrentes na área de TI, e que infelizmente nem todos os desenvolvedores se atentam ao longo de sua carreira (eu incluso por alguns anos) é a importância de conhecer e utilizar os famosos Design Patterns, também conhecido como Padrões de Projetos.

Padrões de Projetos são, como o próprio nome sugere, uma série de padrões de arquitetura de software que auxiliam na melhor forma de utilizar a orientação a objetos ao seu favor para desenvolver e manter projetos de software com técnicas específicas para resolver problemas variados que ocorrem no desenvolvimento. São basicamente soluções para problemas existentes em desenvolvimento de softwares.

Ou seja, alguém já passou por problemas no desenvolvimento que eu ou você talvez esteja passando, e por isso criaram técnicas que irão resolver estes problemas, então para evitar recriarmos a roda usamos os padrões inventados por estas pessoas, agilizando assim o desenvolvimento.

Irei fazer uma introdução breve (ok, não será tão breve assim mas acho que é importante sabermos o começo de algo tão útil na área de TI) da história dos padrões de projetos dando início a uma série de artigos que desta vez pretendo e espero ir até o fim (quem conhece o blog a mais tempo sabe que tenho uma péssima mania de começar as coisas e não terminá-las, eu sei, falha minha mas estou trabalhando para melhorar isso) da série listando com exemplos mais de 20 padrões de projetos utilizados e conhecidos atualmente no mundo do desenvolvimento de software.

O livro que irei utilizar como referência e guia de aprendizado para esta série de artigos será o Head First Design Patterns, traduzido por aqui como Use a Cabeça! Padrões de Projetos. A propósito a tradução ficou muito bem feita, se não puderem comprar a versão americana podem obter a brasileira sem medo que vale a pena cada centavo, falo por experiência própria, a minha cópia é igual a da imagem abaixo.

Use_a_Cabeca_Padroes_de_Projetos.jpg

Tentarei seguir a linha do livro que apresenta ótimos exemplos com os padrões, reorganizando assim a ordem dos mesmos a serem vistos para melhor entendimento. O livro parte do pressuposto que temos o básico do conhecimento de orientação a objetos em dia, mas de qualquer forma são os conceitos básicos dos 4 fundamentos do OO: Herança, Abstração, Polimorfismo e Encapsulamento, clique nos links caso queira dar uma relembrada. Aviso: são artigos antigos de quase 7 anos atrás mas acredito ainda ajudarem no básico.

Além dos conceitos de OO temos alguns princípios básicos da orientação a objetos descritos no livro que serão abordados em conjunto com os padrões nos artigos conforme formos chegando neles.

Abaixo segue uma introdução da história dos padrões de projetos e a listagem dos 23 iniciais, criados pela “gangue dos quatro”.

“Breve” história dos padrões de projeto

O termo “padrões de projeto” se origina do final da década de 70, entre 1977 e 1979, dada pela criação de um arquiteto (de casas/prédios) chamado Christopher Alexander, muito famoso até hoje por suas ideias inovadoras para a época, que influenciaram muitas áreas inclusive a de software.

O livro dele, chamado de A Pattern Language: Towns, Buildings, Construction, introduziu o termo padrões de projeto, incluindo 253 padrões arquiteturais que coletivamente formavam o que os autores chamam de “a pattern language”, ou no português claro, uma linguagem de padrões.

a pattern language.jpg

O conceito sobre este termo influenciou os escritores Donald Norman e Stephen Draper em 1986 a criarem o livro User Centered System Design, que basicamente sugerem a aplicação de padrões de projeto para o design de interação, que é a prática de criar produtos digitais, ambientes, sistemas e serviços interativos para uso humano.

User Centered System Design

Um ano depois, em 1987, Kent Beck (engenheiro de software, criador da metodologia ágil XP) e Ward Cunningham (programador, criador do primeiro Wiki) influenciados pelos livros citados anteriormente já haviam iniciado seus estudos de padrões de projetos e sua aplicabilidade ao design de software, publicando anos depois diversos livros a respeito.

Erich Gamma, um cientista de software muito conhecido no meio de TI, foi outro que notou a importância dos recorrentes padrões de projetos enquanto trabalhava em sua tese de PhD, no final da década de 80. Erich acreditava que padrões de projeto poderiam facilitar a tarefa de escrever software orientado a objeto reusável e pensou em como documentar e comunicar isso efetivamente. Em 1990, Erich e Richard Helm se conheceram e começaram a catalogar padrões de projetos.

Em um workshop na OOPSLA (sigla para Object-Oriented Programming, Systems, Languages & Applications, uma conferência anual relacionada a desenvolvimento de software orientado a objetos) em 1991, Erich e Richard se juntaram a Ralph Johnson e John Vlissides (ambos cientistas de software), e ficaram conhecidos como GoF (Gang of Four, a “Gangue dos Quatro”, mais explicações do nome aqui) e o mais importante: escreveram juntos por alguns anos e lançaram o livro mais conhecido sobre padrões de projeto já feito, chamado Design Patterns: Elements of Reusable Object-Oriented Software, que documenta 23 padrões de projeto de software, em três categorias (criacionais, estruturais e comportamentais).

0201633612_Gamma_rep.qxd

O livro foi lançado oficialmente em 1994, incluindo exemplos em C++ e Smalltalk (linguagens mais usadas na época) e virou referência em padrões de projeto. Mais de 500.000 cópias foram vendidas em inglês e em outras 13 línguas diferentes.

Esta é a história básica do surgimento e disseminação dos padrões de projeto.

Lista dos 23 padrões criados pelo GoF

Os padrões de projeto criados pelo GoF e até hoje a maioria muito utilizados no desenvolvimento de software são divididos em 3 categorias, já citadas anteriormente:

Padrões Criacionais

Padrões criacionais são aqueles que criam objetos para você, ao invés de você ter que instanciá-los diretamente. Isto dá ao seu programa mais flexibilidade em decidir quais objetos precisam ser criados para um caso específico.

Os 5 padrões que temos nesta categoria são:

  • Abstract Factory – agrupam factories de objetos que tem um tema em comum.
  • Builder – constrói objetos complexos separando construção e a representação.
  • Factory Method – cria objetos sem especificar a classe exata a ser criada.
  • Prototype – cria objetos através da clonagem de um objeto existente.
  • Singleton – restringe a criação de objetos para uma classe em apenas uma instância.

Padrões Estruturais

Estes padrões dizem respeito à composição da classe e do objeto. Usam a herança para compor interfaces e definem maneiras de compor objetos para obter novas funcionalidades.

Os 7 padrões que temos nesta categoria são:

  • Adapter – permitem classes com interfaces incompatíveis trabalharem juntas envolvendo sua própria interface em torno de uma classe existente.
  • Bridge – desacopla uma abstração de sua implementação para que os dois possam variar de forma independente.
  • Composite – compõe zero ou mais objetos similares para que eles possam ser manipulados como um único objeto.
  • Decorator – dinamicamente adiciona/substituí o comportamento em um método existente de um objeto.
  • Facade – fornece uma interface simplificada para um grande corpo de código.
  • Flyweight – reduz o custo de criar e manipular uma grande quantidade de objetos similares.
  • Proxy – fornece um espaço reservado para outro objeto para controlar o acesso, reduzir o custo e reduzir a complexidade.

Padrões Comportamentais

A maioria desses padrões de projeto está especificamente preocupada com a comunicação entre objetos, eles se preocupam com a forma como a classe e objetos interagem e com a distribuição de responsabilidades.

Os 11 padrões que temos nesta categoria são:

  • Chain of responsibility – delega comandos para uma cadeia de objetos de processamento.
  • Command  cria objetos que encapsulam ações e parâmetros.
  • Interpreter – implementa uma linguagem especializada.
  • Iterator – acessa os elementos de um objeto sequencialmente sem expor sua representação subjacente.
  • Mediator – permite o acoplamento solto entre as classes sendo a única classe que possui um conhecimento detalhado de seus métodos.
  • Memento – fornece a capacidade de restaurar um objeto em seu estado anterior (ato de desfazer, também conhecido como “CTRL Z”).
  • Observer – é um padrão de publicação / assinatura que permite que vários objetos de observador vejam um evento.
  • State – permite que um objeto altere seu comportamento quando seu estado interno muda.
  • Strategy – permite que uma família de algoritmos seja selecionada on-the-fly no tempo de execução.
  • Template – o método define o esqueleto de um algoritmo como uma classe abstrata, permitindo que suas subclasses ofereçam um comportamento concreto.
  • Visitor – separa um algoritmo de uma estrutura de objeto movendo a hierarquia de métodos para um objeto.

É isso, na próxima parte será dado início de fato a conceitos e exemplos práticos com os padrões de projeto mais utilizados entre estes 23, a ideia é falar de todos mas focar primariamente nos mais utilizados.


Referências usadas na construção do artigo

https://en.wikipedia.org/wiki/Software_design_pattern#History

http://www.javaworld.com/article/2078665/core-java/design-patterns–the-big-picture–part-1–design-pattern-history-and-classification.html (artigo muito bem escrito, que aborda não só a história mas muitos detalhes importantes a respeito dos padrões de projeto com exemplos em Java, se possível leia a parte 2 também)

http://wiki.c2.com/?HistoryOfPatterns

https://en.wikipedia.org/wiki/Design_Patterns

Leitura recomendada

http://www.dofactory.com/net/design-patterns (lista os 23 padrões com exemplos práticos em C#)

Expresse sua opinião!

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s