Dependency Inversion Principle

  • Módulos de alto nível não devem depender de módulos de baixo nível; ambos devem depender de abstrações.
  • As abstrações não devem depender de detalhes; os detalhes devem depender das abstrações.

Não é o mesmo que injeção de dependência

  • Alto nível

    • Classes que descrevem o que o sistema deve fazer, mas não fazem a tarefa em si. Não entra nos detalhes.
  • Baixo nível

  • Abstrações

    • É algo que representação uma ação, mas não contém detalhe sobre como isso tem que ser feito.
  • Detalhes

  • O objetivo do DIP é que alterações em uma parte do código não se propaguem em outros pontos.

  • Fica muito mais fácil de implementar porque você não precisa saber dos detalhes.

  • Evita a programação procedural.

  • Muito mais fácil evoluir, porque basta criar novas implementações para as interfaces.

  • Argumento contra:

    • Não precisa de interface para tudo!

  • Introdução

    • O Princípio de Inversão de Dependências (DIP) é um princípio de projeto de software que afirma que “classes de alto nível não devem depender de classes de baixo nível, ambas devem depender de abstrações”.
    • O DIP é importante porque torna o código mais flexível, testável e fácil de manter.
    • Existem três variações do DIP: DIP forte, DIP fraco e DIP de dependência.
  • Variações do DIP

    • DIP forte: classes de alto nível não devem depender de classes de baixo nível.
    • DIP fraco: classes de alto nível não devem depender de classes de implementação.
    • DIP de dependência: classes de alto nível não devem depender de classes concretas.
  • Vantagens do DIP

    • Flexibilidade: o DIP torna mais fácil alterar as classes de baixo nível sem afetar as classes de alto nível.
    • Testabilidade: o DIP torna mais fácil testar as classes de alto nível, pois elas não dependem de classes de implementação.
    • Manutenção: o DIP torna mais fácil manter o código, pois as classes de alto nível não dependem de classes concretas.
  • Implementação do DIP em código

    • O DIP pode ser implementado em código usando abstrações, interfaces e herança.
  • Exemplo de implementação do DIP

    • Um exemplo de implementação do DIP é uma classe Cliente que depende de uma interface ServicoDeEntrega. A classe ServicoDeEntrega é abstrata e pode ser implementada por diferentes classes, como ServicoDeEntregaExpresso ou ServicoDeEntregaNormal.
  • Conclusão

    • O DIP é um princípio importante de projeto de software que pode ajudar a criar código mais flexível, testável e fácil de manter.

Referências