DEV Community

Cover image for [S.O.L.I.D.] Os Cinco Pilares da Programação Orientada a Objetos. [D] Dependency Inversion Principle - DIP
Diego de Sousa Brandão
Diego de Sousa Brandão

Posted on

[S.O.L.I.D.] Os Cinco Pilares da Programação Orientada a Objetos. [D] Dependency Inversion Principle - DIP

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

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

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

Implementação ProductDatabase com DIP
Image description

ProductService com DIP
Image description

Uso das Classes
Image description

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:

Top comments (1)

Collapse
 
228shipit profile image
John J Montague

👍 atlassian.net - Desenvolvimento tranquilo (pessoal/outro) - EN