Article image
Alam Trindade
Alam Trindade16/12/2022 12:42
Compartilhe

Crie códigos limpos e claros utilizando SOLID. Os 5 princípios para te destacar como profissional.

  • #PHP
  • #TypeScript
  • #Java

Dentro da Programação Orientada a Objetos, o SOLID é um conjunto de princípios que vai te ajudar a escrever códigos cada vez mais limpos, escaláveis e de fácil manutenção. Estes princípios vêm ganhando força no mercado, e os profissionais que o aplicam ganham destaque no mercado de trabalho. Os princípios do SOLID podem ser aplicados a qualquer linguagem de programação em sistemas orientados a objetos.

Estes 5 princípios apareceram pela primeira vez em um trabalho apresentado por Robert J. Martin nos anos 2000, mas a abreviação SOLID foi apresentada anos mais tarde por Michael Feathers. SOLID é um acrônimo para 5 responsabilidades:

S - Single Responsibility Principle (SRP) - Princípio de Responsabilidade Única

O - Open-Closed Principle      (OCP) - Princípio Aberto-Fechado 

L - Liskov Substitution Principle  (LSP) - Princípio da Substituição de Liskov 

I - Interface Segregation Principle (ISP) - Princípio da Segregação de Interface

D - Dependency Inversion Principle (DIP) - Princípio da Inversão de Dependência

A princípio parece complicado, mas à medida que vamos utilizando, estes princípios ficam cada vez mais claros e fáceis de entender. 

SRP - Single Responsibility Principle - Princípio da Responsabilidade Única

O princípio da responsabilidade única sugere que cada classe ou função precisa ter apenas uma única responsabilidade. No exemplo a seguir temos a classe de Usuario, ela possui os campos de email e senha como atributos desta classe, e os métodos Getter e Setter destes atributos:

image

Se eu desejar imprimir os atributos, e criar uma função de imprimir atributos, estarei acrescentando uma responsabilidade a mais para a classe Usuario

image

Portanto, aplicando o princípio SRP, devemos ter uma nova classe:

image

Uma dica importante é que o nome da função ou classe já descreve o que ela faz, se no nome é difícil explicar o que ela faz, é provável que esteja errado.

OCP - Open-Closed Principle - Princípio de Aberto-Fechado

O princípio de aberto-fechado sugere que nossas classes e funções devem estar abertas para extensão e fechadas para modificação. No código a seguir, temos uma classe de cálculo de salários conforme seu cargo:

image

Dessa forma, se precisarmos adicionar um novo cálculo de salário para estagiário, teremos um novo else if, e é isto que o princípio OCP sugere que evitamos, criando uma classe abstrata com o método abstrato de calcular salário, e todas as classes que fazem este cálculo poderão herdar e sobrescrever este método:

image

LSP - Liskov Substitution Principle - Princípio da Substituição de Liskov

O princípio da substituição de Liskov ou LSP, sugere que, se um objeto do tipo T é uma extensão do objeto base S, para todo o programa a subclasse T pode ser substituída pela classe base S sem alterar o funcionamento. Parece difícil mas não é, vamos ao exemplo:

image

As classes Carro e Moto foram estendidas da classe Veiculo, portanto, ao longo do código, as funções que receberem como parâmetro as classes Veiculo, poderão receber Carro ou Moto, porque ambos são derivados da classe principal, e vice-versa: 

image

ISP - Interface Segregation Principle - Princípio de Segregação de Interface

De um modo geral, o ISP sugere que uma classe não deve ser obrigada a implementar métodos que não irá utilizar:

image

Observe que a interface iVeiculo possui o método abstrato Re(), assim, todas as classes que implementam essa interface obrigatoriamente terão que implementar o método Re(), mas é aí surge um problema: Nem todo veículo tem a marcha ré.

 image

A interface possui métodos mais genéricos aos veículos, e as classes que implementam essa interface, terão apenas métodos que realmente irão utilizar.

DIP - Dependency Inversion Principle - Princípio da Inversão de Dependência

O princípio de inversão de dependência sugere que não dependamos de implementações mas de abstrações. Os módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender da abstração. Observe o exemplo a seguir: 

image

No construtor da classe Resetar Senha, é criada uma instância de conexão com o banco de dados, gerando assim um alto nível de acoplamento, e toda vez que eu precisar mudar a conexão com o banco, preciso alterar todas as classes que possui essa instância.

Neste caso, o ideal é que eu tenha uma interface de conexão com o banco de dados e o método de conexão dentro dela. Cada classe de bancos diferentes implementa esta interface, sobrescrevendo este método com a sua própria forma de conexão. 

Para o construtor da classe ResetarSenha, passo a interface de conexão com o banco, e não importa a esta classe qual banco está sendo utilizado, pois tudo já está sendo resolvido pela própria interface.

image

A princípio parece complexo e difícil de entender, mas a prática facilitará tudo. O primeiro passo sempre é o mais difícil, então comece a usar, que em breve vai ser automático a aplicação destes princípios. Comece pelo mais fácil, refatore seus código trocando os nomes das funções para perceber se pode mudar alguma coisa.

A aplicação dos princípios de SOLID deixam nosso código escalável, flexível, fácil de manutenções e fácil para implementar novas funcionalidades e métodos. Estes princípios, aplicados juntamente com técnicas de Clean Code, trazem qualidade nos seus códigos e te destacam no mercado de trabalho!

Compartilhe
Comentários (5)

CO

Carlos Oliveira - 16/12/2022 17:53

Show de bola!

JA

João Anastácio - 16/12/2022 16:43

o SOLID é excenssial e muito fácil de aplicar. Dica para ainda tá acha do confuso, façam resumo com suas próprias palavras e registre em algum lugar. Dica de repositório para fazer seus resumos é o Gitbook

Matheus Vicente
Matheus Vicente - 16/12/2022 14:08

Show de bola esse artigo, parabéns Alam!

Diego Gouveia
Diego Gouveia - 16/12/2022 13:20

Muito bacana Alam!

Artur Campos
Artur Campos - 16/12/2022 13:03

gostei bastante deste artigo, parabéns !!