IGTI Blog
pessoa desenvolvendo padrões de projeto de software

Uma introdução aos Padrões de Projeto

Padrões de Projeto são descrições prontas que dão soluções a problemas repetitivos em projetos.

Não é necessário que você tenha uma grande experiência no processo de desenvolvimento de software orientado a objetos para que já tenha ouvido falar ou trabalhado com os padrões de projeto (design patterns). Projetos de software em diversas áreas e tamanhos utilizam essa técnica que, ao longo dos anos, vem mostrando o seu valor, proporcionando bons resultados, principalmente no que diz respeito a reusabilidade de código e, consequentemente, economia de tempo e dinheiro.

Pode ser que você já conheça e já aplique os padrões em seus projetos, ou que você conheça, porém ainda não aplique e pode ser também que você não conheça e nem aplique, mas possivelmente ao ler esse artigo você vai identificar diversos pontos dos seus projetos em que os padrões de projeto poderão fornecer uma importante solução.

Os Padrões de Projeto surgiram na década de 1970 com o objetivo de auxiliar na solução de problemas recorrentes, inclusive em projetos de desenvolvimento de software. Diante disso, eles são soluções consolidadas para problemas conhecidos, pelo menos até que surja outra solução melhor. Eles são o resultado da experiência, trabalho árduo e muitas tentativas e erros de muitos desenvolvedores e representam as melhores práticas da programação orientada a objetos.

Na Arquitetura de Software o conjunto de padrões mais conhecido origina-se no livro dos autores Gamma, Helm, Johnson e Vlissides, mais conhecidos como a “Gangue dos Quatro” (Gang of Four) ou simplesmente GoF: Design Patterns: Elements of Reusable Objeted-Oriented Software. Esse trabalho é constantemente consultado e auxilia diretamente desenvolvedores em todo o mundo na aplicação de padrões em seus projetos. Os autores identificaram 23 padrões e estes foram categorizados em 3 grupos: Padrões de Criação, Padrões Estruturais e Padrões Comportamentais.

Padrões de Criação

Os Padrões de Criação estão associados diretamente com os mecanismos que controlam a criação de objetos. Em alguns projetos, a tarefa de criar um objeto pode ser algo problemático e possuir algumas particularidades, levando à um nível alto e desnecessário de complexidade. Com isso, o objetivo dos Padrões de Criação é evitar problemas e proporcionar maior controle na tarefa de criação de objetos, separando o processo de criação, conclusão e representação de um objeto.

Os dois principais padrões para implementação de controle de criação de objetos são:

  • FactoryMethod: é um dos padrões de projeto mais conhecidos e tem o objetivo de ocultar detalhes sobre a criação de objetos, fornecendo uma interface para que isso aconteça. A classe que implementa a interface decidirá qual objeto será criado, dentre muitos possíveis.
  • Singleton: ao projetar um sistema, pode-se desejar que uma classe tenha no máximo uma instância. Esse padrão visa garantir essa característica provendo um ponto de acesso global à classe, ou seja, apenas um objeto de uma determinada classe poderá existir, independentemente do número de requisições que sejam feitas para criação de um novo objeto.

O GoF apresenta outros Padrões de Projetos para a criação de objetos, além dos apresentados aqui, tais como: Abstract Factory, Builder e Prototype. Os padrões de criação possuem objetivos bem definidos que envolvem a diminuição da dependência dos construtores das classes e a abstração do processo de criação de objetos, ou seja, o sistema não precisa se preocupar como o objeto é criado, se houver alguma mudança no processo de criação de determinado objeto, o sistema não será afetado.

Padrões Estruturais

Os Padrões Estruturais estão diretamente ligados à composição de uma classe, ou seja, como é formada a sua estrutura. Esse tipo de padrão define formas para criar composições ou adicionar comportamentos à um determinado objeto, sem necessariamente precisar alterar o código-fonte da classe que o implementa.

Os três principais padrões relacionados à esta categoria são:

  • Adapter: geralmente utilizado quando há a necessidade de encaixar uma nova biblioteca de classes à um sistema já existente, adquirida de um novo fornecedor, por exemplo. Como não somos detentores do código-fonte da nova biblioteca, faz-se necessário criar uma adaptação por meio de uma classe que faça a interface do código do novo fornecedor ao formato esperado pelo sistema já existente. Em outras palavras, o padrão Adapter é muito utilizado onde há a necessidade de criar compatibilidade entre um sistema e outros frameworks ou API’s.
  • Decorator: é um padrão de projeto que tem o objetivo de permitir que responsabilidades sejam dinamicamente adicionadas ou removidas de um objeto em tempo de execução, como uma alternativa flexível ao uso de subclasses (herança), permitindo estender funcionalidades.
  • Facade: no desenvolvimento de sistemas é comum o uso de subsistemas e sub-rotinas e o padrão Facade (fachada) define uma interface que torna mais simples o uso do subsistema. A complexidade de uma classe é oculta por meio de uma fachada.

O GoF ainda apresenta outros padrões de projetos estruturais, como o Proxy e o Composite. Os Padrões Estruturais são aquela categoria de padrões de projeto que estão concentradas em como as classes e objetos podem ser compostos para formar grandes estruturas, focando em como as classes herdam de outras classes e também em como essas classes são compostas.

Padrões Comportamentais

Os Padrões Comportamentais, como o próprio nome diz, têm o objetivo de lidar com a forma com que um objeto se comunica com outro(s), sem que eles precisem conhecer muito uns dos outros. A interação entre objetos é um dos pontos principais de um bom projeto de software.

O padrão Mediator tem o objetivo de definir um objeto que encapsula toda a forma como um conjunto de objetos interage e atua como um mediador entre relacionamentos de objetos muitos-para-muitos, evitando referências explícitas aos objetos, promovendo o baixo acoplamento. O Mediator diminui a complexidade de relacionamentos entre objetos, centralizando a comunicação e facilitando a manutenção.

Outro padrão comportamental amplamente utilizado é o Observer, cujo objetivo principal é definir uma dependência um-para-muitos entre objetos. Quando um objeto mudar de estado, todos os dependentes são notificados e atualizados automaticamente e, para isso, o padrão Observer mantém uma lista com seus dependentes.

Outros Padrões Comportamentais muito populares em projetos de desenvolvimento de software são: Command, Strategy, TemplateMethod e Iterator.

Benefícios do uso dos Padrões de Projeto

A adoção de padrões pode trazer inúmeros benefícios para um projeto de desenvolvimento de  software. Um dos principais benefícios é que um padrão de projeto é algo que já foi utilizado inúmeras vezes na solução de um determinado tipo de problema e, devido a isso, o padrão já foi submetido à uma grande variedade de testes e, se ele se tornou um padrão de projeto, é porque foi aprovado nesses testes.

Outro benefício da utilização dos padrões é a facilidade de entendimento e manutenção do código-fonte. A padronização contribui diretamente para a redução do acoplamento e para o aumento da coesão de nossas classes, proporcionando uma redução de custo e tempo em nossas futuras manutenções. Como outros benefícios, podemos destacar:

  • Documentação e solução para um problema recorrente;
  • Soluções reusáveis;
  • Padronização da estrutura das classes, contribuindo para a organização geral do sistema;
  • Redução da quantidade de refatorações que podem ser necessárias no futuro;
  • Facilidade de comunicação, já que os padrões de projeto trazem um vocabulário comum.

Conclusão

Os padrões de projeto representam uma técnica baseada em reuso de software que permite ao desenvolvedor experimentar os inúmeros benefícios práticos dessa tecnologia em seus projetos de software. Para alcançar esses benefícios é importante que exista uma ampla e disponível documentação sobre cada um dos padrões adotados e também uma conscientização dos desenvolvedores e projetistas acerca das vantagens e benefícios de seu uso.

Professor autor: João Paulo B. Nascimento