Dependency Inversion Principle
Acoplamento
Uma classe com muitas dependências tem acoplamento com muitas outras classes. Além disso, o código acaba acoplado também às dependências das dependências e assim por diante.
Mudanças nas dependências, ou nas dependências das dependências, podem acabar se propagando para a classe que as utiliza. Precisamos ter atenção para evitar que dependências indesejadas se espalhem indevidamente pelo nosso código.
Acoplamento bom x Acoplamento ruim
Acoplamento precisa existir. Uma classe totalmente desacoplada é uma classe inútil.
Num código Java desde o primeiro OlaMundo
dependemos de String
e System
. Essas classes do pacote java.lang
são estáveis: mudam muito pouco.
Classes estáveis têm essa característica porque milhões de projetos as usam e mudá-las teria um impacto gigantesco. Por isso, podemos depender delas tranquilamente. Esse é um acoplamento bom.
Depender de classes voláteis, por sua vez, é o acoplamento ruim.
Abstrações e Inversão das Dependências
Podemos usar classes abstratas e, preferencialmente, interfaces. Abstrações são estáveis: mudam muito menos que implementações.
Podemos também usar classes concretas como abstrações, desde que não deixemos detalhes de outras dependências vazarem.
Ao usarmos classes abstratas ou interfaces, o código não depende mais diretamente da dependência volátil e sim da abstração. E a dependência volátil, por sua vez, também depende da abstração, implementando-a. Por isso, podemos dizer que a dependência é invertida.
Devemos evitar que detalhes das dependências vazem nas nossas abstrações.