O Dependency Inversion Principle – Entendendo SOLID – parte 5

O Dependency Inversion Principle – Entendendo SOLID – parte 5

Foi uma longa jornada e que jornada não é mesmo!? Falamos sobre todos os princípios SOLID e hoje é a vez de falarmos do último: O Dependency Inversion Principle. Porém, caso não tenha visto nossas outras postagens, não perca tempo e veja todas elas aqui.

O DIP (Dependency Inversion Principle) em original fala que:

  • High-level modules should not depend on low-level modules. Both should depend on abstractions.
  • Abstractions should not depend on details. Details should depend on abstractions.

Ou seja, módulos de alto nível não devem depender de módulos de níveis menores, mas ambos de abstrações. Além disso o princípio também diz que as abstrações não devem depender de detalhes e sim os detalhes que devem depender de abstrações.

Eu sei, eu sei. Falamos muita coisa mas tudo ainda parece meio abstrato ou nebuloso não é mesmo? Quando dizemos em módulos de alto nível, vamos pensar por exemplo em módulos que contém nossa regra de negócio e quando falamos de módulos de baixo nível vamos pensar por exemplo em módulos que realizam a interação com o banco de dados. Faria sentido que ao mudar alguma regra de negócio eu também tenha que alterar a forma como eu interajo com minha base de dados? Não!

Falamos muito disso quando tratamos do Open/Closed principle. Alterar uma classe não deveria de forma alguma afetar o cliente dessa classe para que os contratos definidos por nossa aplicação não sejam quebrados.

Para facilitar, vamos ao nosso exemplo:

falha_no_dependency_inversion_principle

Perceba no exemplo que temos uma falha no DIP. O botão conhece detalhes da implementação e é dependente da lampada. Mudanças nesse modelo podem fazer com que esse código deixe de funcionar como o esperado, como alterar o nome do método ligar por exemplo, deletar a classe Lampada, etc. Além disso, um botão não deveria ser restrito somente a um tipo de interação, mas sim de poder desligar/ligar o que quer que seja uma lâmpada, um ventilador ou qualquer outra coisa.

O Interface Segregation Principle

Vejamos agora como esse exemplo poderia ser feito sem ferir o DIP:

dependency_inversion_principle

Mais uma vez, utilizando injeção de dependências agora desacoplamos o Botão do modelo lampada, criando uma abstração onde qualquer dispositivo passado por parâmetro possa ser acionado, seja ele de qualquer tipo, bastando que este objeto responda ao método ligar, satisfazendo finalmente o Dependency Inversion Principle.

Nessa nova abordagem, nossa classe é muito mais flexível, fácil de testar e garante a evolução saudável de nosso código. O importante, sempre quando falamos em toda a nossa série sobre SOLID é que o leitor compreenda que todos os princípios abordados são ótimas práticas a serem seguidas no mundo da Orientação à Objetos. Com elas, melhoramos nossa arquitetura de uma forma geral, garantimos reusabilidade, manutenibilidade e robustez, permitindo criarmos pequenas classes com responsabilidades bem definidas. Dessa forma, ganhamos também maior clareza em nosso código deixando-o mais legível e permitindo a criação de testes unitários simples, que também servem como boa documentação!

Bem, espero que tenham gostado dessa nossa pequena jornada mas saiba que não paramos por aqui! Lembrando que toda semana teremos novos posts e que semana que vem uma nova série se inicia. Deixe nos comentários que tipo de conteúdo vocês gostariam que trouxéssemos ao nosso blog, lembrando que críticas, dúvidas, sugestões e comentários são sempre bem vindos.

Espero te ver por aqui na semana que vem!

Algumas fontes utlizadas nesse post:

  • http://www.getlaura.com/dependency-inversion-principle-in-ruby/
  • https://www.netguru.co/codestories/solid-5-dip
  • https://www.linkedin.com/pulse/understanding-solid-principles-dependancy-injection-despoudis/
  • https://robsoncastilho.com.br/2013/05/01/principios-solid-principio-da-inversao-de-dependencia-dip/
  • https://robots.thoughtbot.com/back-to-basics-solid

 

Sobre nós

Vivemos em uma era onde a tecnologia se faz presente em todo setor corporativo, independente do ramo de atividade. Surgimos visando esta crescente demanda.

Nossos contatos

+55 (11) 2528 7798
+55 (11) 98081 4290