[S.O.L.I.D.] Os Cinco Pilares da Programação Orientada a Objetos. [D] Dependency Inversion Principle - DIP
Tags: java, solidprinciples
Published: 2024-05-25 02:25:46

Continuando a série sobre SOLID, caso não tenha lido o artigo anterior:

{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-i-interface-segregation-principle-isp-3ho3 %}

Neste artigo estarei falando sobre o **quinto** e último **princípio** que é:

**[D] - Dependency Inversion Principle**
**Princípio da Inversão de Dependência - DIP**
“Módulos de alto nível não devem depender de módulos de
baixo nível. Ambos devem depender de abstrações;
Abstrações não devem depender de detalhes.”

Vamos considerar um exemplo de um sistema de gestão de produtos em uma loja online. Este sistema precisa armazenar informações sobre os produtos em um banco de dados. Inicialmente, podemos implementar isso com uma dependência direta da classe ProductDatabase na classe ProductService. Em seguida, aplicaremos o Princípio da Inversão de Dependência (DIP) para melhorar o design.

_Sem DIP_
**Implementação direta**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f333l6seujzt97zxf3tx.png)

**Neste exemplo, ProductService depende diretamente de ProductDatabase, o que viola o DIP.**

_Com DIP_
Para seguir o DIP, vamos introduzir uma interface para a interação com o banco de dados e fazer com que ProductService dependa dessa interface em vez de uma implementação concreta.

**Interface ProductRepository**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qmdfhqechf1fg3l18dwc.png)

**Implementação ProductDatabase com DIP**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ckft0xia4xulrq45jagg.png)

**ProductService com DIP**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/48rig7j8hc65hojgyp79.png)

**Uso das Classes**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d4viyj6nrfb21ngpyfo9.png)

Explicação:

- Interface ProductRepository: Introduzimos uma interface para definir o contrato para interagir com o banco de dados de produtos.

- Implementação ProductDatabase com DIP: Implementamos a interface ProductRepository na classe ProductDatabase. Isso separa a lógica de interação com o banco de dados do restante do código.

- ProductService com DIP: ProductService agora depende apenas da abstração ProductRepository, não de uma implementação concreta de banco de dados. Isso permite uma maior flexibilidade e facilidade de manutenção, pois podemos trocar facilmente a implementação do banco de dados sem alterar ProductService.

**Ao seguir o Princípio da Inversão de Dependência, garantimos que os módulos de alto nível (como ProductService) dependam de abstrações (como ProductRepository) em vez de depender de implementações concretas. Isso torna o código mais flexível, reutilizável e de fácil manutenção, pois reduz o acoplamento entre os componentes do sistema.**


_PS: Caso não tenho visto ou queira ver os princípios na ordem segue link abaixo:_

{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-para-desenvolvedores-2lph %}

{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-o-openclosed-principle-ocp-3bal %}

{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-l-liskov-substitution-principle-lsp-5ebg %}

{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-i-interface-segregation-principle-isp-3ho3 %}