Entendendo S.O.L.I.D
Tags: braziliandevs, ptbr, programming, beginners
Published: 2023-03-03 11:39:41

Eae gente bonita, beleza?

Recentemente eu resolvi me aprofundar sobre esse assunto, rever e entender alguns princípios pois nem todos estavam muito claros para mim. Então aqui está uma descrição do que é cada letra de S.O.L.I.D.

## S - Single Responsibility
_(Principío de Responsabilidade única)_

O Single Resonsability é uma dos mais importantes, ele torna o seu código muito mais fácil de se entender e de dar manutenção. 
Mas o que exatamente significa responsabilidade única? Como ja diz a sua descrição.

Vamos pensar em um classe que salva usuários no banco de dados, podendo fazer uma implementação para que a mesma também salve nome de livros no banco, dessa forma essa classe tem mais de uma responsabilidade, o que fere o principío de single responsability. Essa classe deve apenas salvar usuários no banco e nada mais, assim ela segue o principío de single responsability.


## O - Open-closed principle
_(Principío Aberto/Fechado)_

Esse princípio diz que classes, métodos e funções podem estar abertas para extensões, porém fechadas para modificações. 
Mas como assim? Imagino que você já deve ter criado ou visto aquelas funções que recebem um valor e uma flag, onde essa flag vai para um if que define se o código vai fazer X ou Y. 

Então é basicamente isso que o open-closed principle diz para se **evitar**. Em um momento a sua classe sabe criar, porém com a necessidade do projeto ela "deixa" de criar e agora ela só edita. Quando na verdade ela pode começar a editar, mas nunca esquecendo como se criar.

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

Esse princípio diz que se temos uma classe e criarmos uma outra classe a partir dela usando a herança, a classe nova deve conseguir **substituir** a classe que foi herdada sem que o código seja quebrado.

A ideia desse princípio é forçar você a pensar e nas suas abstrações e forçar que todas fiquem no nível certo.

Exemplo: Vamos supor que eu criei uma classe chamada **Ave** e nela nós temos os seguintes métodos `bicar()` e `voar()`. Se eu criar um classe chamada **PicaPau** ela vai herdar os métodos bicar e voar e está tudo bem pois um picapau faz isso. Porém se eu criar uma classe chamada **Avestruz** nós teremos um problema, pois um avestruz não voa. Logo a classe **Avestruz** se necessário não poderia substituir a classe **Ave**.

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

Uma classe não deve implementar uma interface com métodos que ela não usa.
Por exemplo vamos imaginar uma interface chamada *Pessoa* onde nela nós devemos implementar 3 métodos, *andar*, *falar* e *listaAlunos* se nós criarmos um classe Professor baseado nessa interface, ela serve perfeitamente, porém para criar uma classe Aluno não pois um aluno não tem alunos. E isso vai de encontro também com os princípios anteriores.

## D - Dependency Inversion Principle
_(Principío da Inversão de Dependência )_

Esse princípio diz que a sua classe não deve depender de detalhes de implementação de outras classes para poder funcionar.
Por exemplo, vamos supor que temos uma classe que cria usuários e nela nós pegamos a senha desses usuários e usamos uma lib para criar um hash e salvar essa senha de forma mais segura. 
Porém, por algum motivo nós vamos ter que trocar essa lib e isso faz com o seu código quebre, pois a criação depende do código dessa lib para funcionar. 

A ideia aqui é que a função de gerar o hash seja extraída e colocada em uma função que recebe a senha e retorna uma string que no caso é o hash e dentro dessa função você faça a implementação da sua lib. Pois assim você sempre estará respeitando a interface dela onde independente do que precise para você implementar essa lib a sua classe de criar usuários não irá quebrar.

---


***Refrências***

[SOLID fica FÁCIL com Essas Ilustrações](https://www.youtube.com/watch?v=6SfrO3D4dHM&t=338s) by @filipedeschamps 

[The S.O.L.I.D Principles in Pictures
](https://medium.com/backticks-tildes/the-s-o-l-i-d-principles-in-pictures-b34ce2f1e898)

Capa: [Laiane Matias](www.linkedin.com/in/laiane-matias)

Se chegou até aqui, me segue la nas [redes vizinhas.]  (https://bento.me/cmsdev)
<img src="https://media.giphy.com/media/uWlpPGquhGZNFzY90z/giphy.gif" />