Neste repositório, apresento exemplos de como aplicar os Princípios SOLID em JavaScript, com cada exemplo demonstrando um princípio específico.
No exemplo do Princípio da Responsabilidade Única (SRP), crio um sistema de processamento de pagamentos. Divido a responsabilidade de validar e processar pagamentos em classes separadas, cada uma fazendo apenas uma coisa:
-
Correto: Criei duas classes,
ProcessadorDePagamento
eValidadorDePagamento
, cada uma com uma responsabilidade específica: processar e validar pagamentos, respectivamente. A classeClienteDeProcessamentoDePagamento
coordena essas classes para processar pagamentos, mantendo a separação de responsabilidades. -
Incorreto: No exemplo incorreto, a classe
ProcessadorDePagamentoIncorreto
mistura validação dentro do métodoprocessarPagamento
, violando o SRP.
Exemplo Correto | Exemplo Incorreto
No exemplo do Princípio da Substituição de Liskov (LSP), crio um sistema de cálculo de áreas de formas geométricas. Mostro como as classes devem ser feitas para que uma subclasse possa substituir sua superclasse sem quebrar o programa:
-
Correto: Implementei as classes
Retangulo
eQuadrado
de forma que um quadrado possa substituir um retângulo em qualquer contexto, seguindo o LSP. -
Incorreto: No exemplo incorreto, a classe
QuadradoIncorreto
herda da classeRetanguloIncorreto
, violando o LSP.
Exemplo Correto | Exemplo Incorreto
No exemplo do Princípio da Segregação de Interface (ISP), crio um sistema que mostra como interfaces separadas podem levar a um design mais flexível:
-
Correto: Criei interfaces separadas para
Impressora
,Scanner
eFax
. A classeMultifuncional
usa essas interfaces para realizar suas operações. -
Incorreto: No exemplo incorreto, a classe
MultifuncionalIncorreto
tem métodos que não são relevantes para todas as suas instâncias.
Exemplo Correto | Exemplo Incorreto
No exemplo do Princípio da Inversão de Dependência (DIP), crio um sistema de processamento de dados. Mostro como uma classe de alto nível pode depender de abstrações em vez de implementações específicas:
-
Correto: A classe
ProcessadorDeDados
depende de uma abstração (salvadorDeDados
) em vez de depender diretamente das implementações específicas (BancoDeDados
eGerenciadorDeArquivos
). -
Incorreto: No exemplo incorreto, a classe
ProcessadorDeDadosIncorreto
depende diretamente das implementações específicasBancoDeDados
eGerenciadorDeArquivos
.