Os 7 padrões de design de software mais importantes

Para um aprofundamento abrangente do assunto de Padrões de Design de Software, confira Padrões de Design de Software: Melhores Práticas para Desenvolvedores, criados por C.H. Afzal, um engenheiro de software veterano com vários anos de experiência na Netflix, Microsoft e Oracle. Muito do abaixo é resumido em seu curso.

Por que padrões de design?

Os Padrões de Design se tornaram objeto de alguma controvérsia no mundo da programação nos últimos tempos, em grande parte devido à sua 'superutilização', levando a códigos que podem ser mais difíceis de entender e gerenciar.

É importante entender que os Padrões de Design nunca foram criados para serem hackeados, atalhos para serem aplicados de maneira aleatória, 'tamanho único' para o seu código. Em última análise, não há substituto para a capacidade genuína de resolução de problemas na engenharia de software.

No entanto, permanece o fato de que os Padrões de Design podem ser incrivelmente úteis se usados ​​nas situações certas e pelos motivos certos. Quando usados ​​estrategicamente, eles podem tornar um programador significativamente mais eficiente, permitindo que eles evitem reinventar a roda proverbial, em vez de usar métodos refinados por outros já. Eles também fornecem uma linguagem comum útil para conceituar problemas e soluções repetidas ao discutir com outras pessoas ou ao gerenciar código em equipes maiores.

Dito isto, uma ressalva importante é garantir que o como e o porquê de cada padrão também sejam entendidos pelo desenvolvedor.

Sem mais delongas (em ordem de importância geral, do mais para o menos):

Os padrões de design mais importantes

  1. Singleton

O padrão singleton é usado para limitar a criação de uma classe a apenas um objeto. Isso é benéfico quando um (e apenas um) objeto é necessário para coordenar ações em todo o sistema. Existem vários exemplos de onde apenas uma única instância de uma classe deve existir, incluindo caches, conjuntos de encadeamentos e registros.

É trivial iniciar um objeto de uma classe - mas como podemos garantir que apenas um objeto seja criado? A resposta é tornar o construtor "privado" para a classe que pretendemos definir como um singleton. Dessa forma, apenas os membros da classe podem acessar o construtor privado e mais ninguém.

Consideração importante: é possível subclassificar um singleton tornando o construtor protegido em vez de privado. Isso pode ser adequado em algumas circunstâncias. Uma abordagem adotada nesses cenários é criar um registro de singletons das subclasses e o método getInstance pode usar um parâmetro ou usar uma variável de ambiente para retornar o singleton desejado. O registro mantém um mapeamento de nomes de cadeias para objetos singleton, que podem ser acessados ​​conforme necessário.

2. Método de Fábrica

Uma fábrica normal produz mercadorias; uma fábrica de software produz objetos. E não apenas isso - ele faz isso sem especificar a classe exata do objeto a ser criado. Para fazer isso, os objetos são criados chamando um método factory em vez de chamar um construtor.

Geralmente, a criação de objetos em Java ocorre da seguinte forma:

SomeClass someClassObject = new SomeClass ();

O problema com a abordagem acima é que o código que usa o objeto do SomeClass agora repentinamente se torna dependente da implementação concreta do SomeClass. Não há nada de errado em usar o novo para criar objetos, mas ele vem com a bagagem de acoplar nosso código à classe de implementação concreta, que às vezes pode ser problemática.

3. Estratégia

O padrão de estratégia permite agrupar algoritmos relacionados em uma abstração, o que permite alternar um algoritmo ou política para outro sem modificar o cliente. Em vez de implementar diretamente um único algoritmo, o código recebe instruções de tempo de execução, especificando qual grupo de algoritmos executar.

4. Observador

Esse padrão é uma dependência de um para muitos entre objetos, de modo que quando um objeto muda de estado, todos os seus dependentes são notificados. Isso geralmente é feito chamando um de seus métodos.

Por uma questão de simplicidade, pense no que acontece quando você segue alguém no Twitter. Você está basicamente pedindo ao Twitter para enviar a você (o observador) atualizações de tweets da pessoa (o assunto) que você seguiu. O padrão consiste em dois atores, o observador que está interessado nas atualizações e o sujeito que gera as atualizações.

Um sujeito pode ter muitos observadores e é um relacionamento de muitos. No entanto, um observador é livre para assinar atualizações de outros assuntos também. Você pode se inscrever no feed de notícias de uma página do Facebook, que seria o assunto e sempre que a página tiver uma nova postagem, o assinante verá a nova postagem.

Consideração importante: no caso de muitos assuntos e poucos observadores, se cada sujeito armazenar seus observadores separadamente, aumentará os custos de armazenamento, pois alguns assuntos armazenarão o mesmo observador várias vezes.

5. Construtor

Como o nome indica, um padrão do construtor é usado para construir objetos. Às vezes, os objetos que criamos podem ser complexos, compostos de vários subobjetos ou exigir um processo de construção elaborado. O exercício de criar tipos complexos pode ser simplificado usando o padrão do construtor. Um objeto composto ou agregado é o que um construtor geralmente constrói.

Consideração chave: O padrão do construtor pode parecer semelhante ao padrão de "fábrica abstrata", mas uma diferença é que o padrão do construtor cria um objeto passo a passo, enquanto o padrão abstrato de fábrica retorna o objeto de uma só vez.

6. Adaptador

Isso permite que classes incompatíveis trabalhem juntas convertendo a interface de uma classe para outra. Pense nisso como uma espécie de tradutor: quando dois chefes de estado que não falam um idioma comum se encontram, geralmente um intérprete fica sentado entre os dois e traduz a conversa, possibilitando a comunicação.

Se você tiver dois aplicativos, com um emitindo saída como XML e o outro exigindo entrada JSON, precisará de um adaptador entre os dois para fazê-los funcionar perfeitamente.

7. Estado

O padrão de estado encapsula os vários estados em que uma máquina pode estar e permite que um objeto altere seu comportamento quando seu estado interno for alterado. A máquina ou o contexto, como é chamado no discurso padrão, pode executar ações que a impulsionam a diferentes estados. Sem o uso do padrão, o código se torna inflexível e cheio de condicionais if-else.

Deseja continuar aprendendo?

Com os padrões de design de software: práticas recomendadas para desenvolvedores, você terá a chance de fazer mais do que apenas ler a teoria. Você poderá se aprofundar em problemas reais e entender soluções práticas com exemplos de códigos da vida real.

O curso é baseado no livro popular da Gangue dos Quatro, mas apresentado em um formato interativo e fácil de digerir. Você dominará os 23 famosos padrões de design do livro de maneira interativa, aprenderá as aplicações apropriadas dos 3 principais tipos de padrões de design (criacional, estrutural e comportamental) e aprenderá a incorporar esses padrões de design em seus próprios projetos.

Verifique isso agora.

Publicado originalmente em blog.educative.io em 7 de novembro de 2018.