Padrões De Projeto - Padrões de Projeto (Design Patterns): O Que São e Como Podem Melhorar o ...
Padrões de Projeto (Design Patterns): O Que São e Como Podem Melhorar o ...

O código que todo mundo copia e cola

Tem um momento na vida de qualquer desenvolvedor em que você percebe que está resolvendo o mesmo problema três vezes no mesmo mês. A primeira vez, você improvisa. A segunda, você refatora. A terceira, você reconhece o padrão e pensa: finalmente. Isso é o básico sobre padrões de projeto. Eles são soluções reutilizáveis para problemas recorrentes no design de software. Não são receitas mágicas, não são bibliotecas que você importa e funciona. São descrições abstratas de como resolver algo que já apareceu cem vezes antes.

Por que padrões de projeto ainda importam em 2024

Acredite ou não, mesmo com frameworks que abstraem quase tudo, padrões de projeto continuam sendo a linguagem que os desenvolvedores seniores usam para se comunicar. Quando alguém diz "usa um observer aqui", todo mundo sabe o que significa. Se você descrever o problema sem o vocabulário certo, gasta dez minutos a mais explicando do que deveria. O Gang of Four — Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides — publicou o livro original em 1994. O conteúdo ainda é relevante porque os padrões descrevem estruturas fundamentais, não tecnologias específicas. Um padrão Strategy não depende de Java, Cou TypeScript. Ele descreve um conceito que existe independentemente da linguagem.

Eu tive um problema bem específico com isso no passado. Estava trabalhando em um sistema de caching que precisava suportar três estratégias diferentes: memória, Redis e arquivo, com fallback automático entre elas. A solução óbvia seria uma cadeia de if/else verificando qual cache estava disponível. Em vez disso, apliquei o padrão Strategy com uma factory simples. O resultado foi uma classe de 60 linhas que poderia ter sido trinta linhas de procedural, mas que cresceu para cem linhas quando precisei adicionar logging, métricas e tratamento de exceções por strategy. O trade-off entre flexibilidade e complexidade é real.

Como começar a usar padrões de projeto na prática

O erro mais comum que eu vejo é pessoas tentando decorar padrões antes de encontrar os problemas que eles resolvem. Você estuda o padrão Observer durante dois dias, mas nunca implementou um. Na hora que precisa, não sabe onde encaixar. O caminho certo é diferente. Comece observando problemas. Quando você nota que precisa notificar vários componentes quando algo muda, aí você busca o padrão Observer. Quando percebe que está criando objetos de formas inconsistentes pelo código todo, você procura por padrões criacionais. A sequência inversa — estudar padrões sem contexto — geralmente resulta em forçar soluções em problemas que não existem.

Existem três categorias principais que você precisa conhecer: Criacionais: Singleton, Factory Method, Abstract Factory, Builder, Prototype. Resolvem o problema de como criar objetos de forma controlada e flexível.

Estruturais: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy. Lidam com a composição de classes e objetos em estruturas maiores. Comportamentais: Observer, Strategy, Command, Iterator, Mediator, Memento, State, Template Method, Visitor, Chain of Responsibility. Focam na comunicação entre objetos e na responsabilização.

Isso não é tudo. O livro original tem 23 padrões. Mas na prática diária, cerca de oito a doze aparecem com frequência suficiente para valer o esforço de aprendizado profundo. O resto você consulta quando precisa.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Padrões que realmente uso todos os dias

Strategy e Observer estão no top dois da minha lista. Strategy é útil para qualquer coisa que tenha múltiplas formas de fazer a mesma coisa. Calculei impostos de diferentes formas. Processei pagamentos por cartão, PIX ou boleto. Apliquei regras de negócio que mudam conforme o contexto. O padrão permite trocar a implementação sem tocar no código que a consome. Observer é onipresente em aplicações com interface gráfica, sistemas reativos e qualquer coisa que precise de desacoplamento entre produtores e consumidores de eventos. O problema é que todo mundo implementa observer errado na primeira vez. Criam acoplamento direto entre o sujeito e os observadores, violando exatamente o principio que o padrão deveria proteger.

Factory Method aparece quase em todo projeto que cria instâncias de dependências. Depende muito do framework que você usa. Se estiver usando Spring, DI container já resolve. Se estiver em Node com NestJS, o mesmo. Mas em ambientes sem injeção de dependência, factory method é a solução mais limpa que existe. Facade é subestimado. É basicamente uma interface simplificada para um subsistema complexo. Você tem dez classes que fazem coisas relacionadas e ninguém consegue entender como elas interagem. Uma facade expõe cinco métodos claros e pronto. Custa poucas horas de trabalho e economiza semanas de entendimento coletivo.

O que ninguém te conta sobre padrões de projeto

Padrões de projeto são ferramentas, não regras. Usá-los cegamente é pior do que não usá-los de forma consciente. Eu vi projetos inteiros desviarem do objetivo original porque a equipe decidia "implementar o padrão correto" em vez de resolver o problema real. Um exemplo concreto: um colega meu implementou o padrão Template Method em uma classe base de validação que cresceu para duzentos e cinquenta métodos. Cada subclasse sobrescrevia dois ou três métodos, mas o acoplamento hierárquico tornou impossível testar qualquer validação isoladamente. O padrão existia porque era "o certo a se fazer", não porque o problema pedia por ele. Migrei para composição simples e o tempo de deploy caiu de minutos para segundos.

Outro ponto importante: padrões de projeto resolvem problemas de design, não de implementação. Conhecer o padrão não significa saber escrevê-lo em código. A tradução exige entender o domínio do problema. O padrão Singleton, por exemplo, é trivial de escrever em vinte linhas de código. É difícil saber quando NÃO usar Singleton, e mais difícil ainda implementar uma versão thread-safe que não degrade performance em cenários de alta concorrência. Há também o problema do overengineering. Padrões como Visitor e Interpreter são poderosos, mas adicionam camadas de indireção que custam tempo de manutenção. Em projetos pequenos ou de vida curta, o custo supera o benefício. Em projetos enterprise que vão existir por cinco anos ou mais, o investimento inicial se paga rapidamente.

Quando padrões de projeto falham completamente

Singleton é o padrão mais problemático que existe. Dificulta testes, esconde dependências, introduz estado global e cria acoplamento silencioso. Em sistemas distribuídos, a noção de "uma única instância" perde o sentido imediatamente. Se o seu sistema roda em múltiplos nós, você precisa de um gerenciador de cluster, não de um singleton. Observer também tem limitações sérias. Em sistemas com muitos observadores e muitos eventos, o padrão pode se tornar um pesadelo de debugging. Rastreiar quem está ouvindo o quê em uma arquitetura com dezenas de observers distribuídos é trabalhoso. Frameworks como Redux e Event Sourcing nascaram exatamente para resolver parte desse problema, mas trazem sua própria complexidade.

Factory Method e Abstract Factory podem criar hierarquias de classes explosivas. Se você tem cinco produtos e três famílias, a contagem de classes cresce rapidamente. Em alguns casos, usar reflexão ou configuração externa é mais prático do que manter uma hierarquia de fábricas.

Como aprofundar sem perder tempo

Leia o Gang of Four. É denso, mas é a fonte. Se o livro original parecer seco demais, procure por implementações práticas em GitHub. Procure por repositórios que aplicam padrões em projetos reais, não em exemplos acadêmicos. Ver um padrão aplicado corretamente em código de produção vale mais do que cem explicações teóricas. Implemente um padrão por semana durante algumas semanas. Escolha um que você realmente precisa no seu trabalho atual. Estrategista se você tem regras de negócio variantes. Observer se você trabalha com eventos. Factory se você cria objetos sem controle. Praticar com contexto real fixa o conhecimento muito mais rápido do que estudar isoladamente.

Acompanhe a evolução dos padrões. O livro de 1994 é clássico, mas há discussions recentes sobre padrões emergentes em arquiteturas modernas. Microsserviços, serverless e event-driven introduziram variações e novos desafios que o GoF não cobre. Revisitando padrões sob essa ótica, você descobre nuances que não estavam explícitas no original. O melhor indicador de que você domina padrões de projeto não é conseguir nomeá-los. É conseguir identificar quando NÃO usá-los. Se você consegue olhar para um problema e dizer "isso não precisa de um padrão, é só uma função simples", você entendeu o que importa.