Uma introdução rápida à injeção de dependência: o que é e quando usá-la

Introdução

Na engenharia de software, injeção de dependência é uma técnica pela qual um objeto (ou método estático) fornece as dependências de outro objeto. Uma dependência é um objeto que pode ser usado (um serviço).

Essa é a definição da Wikipedia, mas ainda assim, mas não é particularmente fácil de entender. Então vamos entender melhor.

Antes de entender o que isso significa em programação, vamos primeiro ver o que significa em geral, pois nos ajudará a entender melhor o conceito.

Dependência ou dependente significa contar com algo para suporte. Tipo, se eu disser que dependemos demais de telefones celulares do que significa que dependemos deles.

Portanto, antes de chegar às injeções de dependência , primeiro vamos entender o que significa dependência na programação.

Quando a classe A usa alguma funcionalidade da classe B, então é dito que a classe A tem uma dependência da classe B.

Em Java, antes de podermos usar métodos de outras classes, primeiro precisamos criar o objeto dessa classe (ou seja, a classe A precisa criar uma instância da classe B).

Portanto, transferir a tarefa de criar o objeto para outra pessoa e usar diretamente a dependência é chamado de injeção de dependência.

Por que devo usar injeção de dependência?

Digamos que temos uma classe de carro que contém vários objetos, como rodas, motor, etc.

Aqui, a classe car é responsável por criar todos os objetos de dependência. Agora, e se decidirmos abandonar MRFWheels no futuro e quisermos usar Yokohama Wheels?

Precisaremos recriar o objeto carro com uma nova dependência Yokohama. Mas ao usar injeção de dependência (DI), podemos alterar as rodas em tempo de execução (porque as dependências podem ser injetadas em tempo de execução em vez de em tempo de compilação).

Você pode pensar em DI como o intermediário em nosso código que faz todo o trabalho de criar o objeto de rodas preferido e fornecê-lo à classe Carro.

Isso torna nossa classe Car independente da criação dos objetos Wheels, Battery, etc.

Existem basicamente três tipos de injeção de dependência:

  1. injeção de construtor: as dependências são fornecidas por meio de um construtor de classe.
  2. injeção setter: o cliente expõe um método setter que o injetor usa para injetar a dependência.
  3. injeção de interface: a dependência fornece um método injetor que injetará a dependência em qualquer cliente transmitido a ela. Os clientes devem implementar uma interface que expõe um método setter que aceita a dependência.

Portanto, agora é responsabilidade da injeção de dependência:

  1. Crie os objetos
  2. Saiba quais classes requerem esses objetos
  3. E fornecer a eles todos esses objetos

Se houver alguma alteração nos objetos, o DI examina isso e não deve se preocupar com a classe que usa esses objetos. Dessa forma, se os objetos mudarem no futuro, é responsabilidade da DI fornecer os objetos apropriados para a classe.

Inversão de controle - o conceito por trás de DI

Isso afirma que uma classe não deve configurar suas dependências estaticamente, mas deve ser configurada por alguma outra classe externa.

É o quinto princípio do SOLID - ocinco princípios básicos de programação orientada a objetos e design de Uncle Bob - que afirma que uma classe deve depender de abstração e não de concreções (em termos simples, hard-coded).

De acordo com os princípios, uma classe deve se concentrar no cumprimento de suas responsabilidades e não na criação de objetos necessários para cumprir essas responsabilidades. E é aí que a injeção de dependência entra em ação: ela fornece à classe os objetos necessários.

Nota: Se você deseja aprender sobre os princípios SOLID do Tio Bob, você pode acessar este link.

Benefícios de usar DI

  1. Ajuda em testes de unidade.
  2. O código do boiler plate é reduzido, pois a inicialização das dependências é feita pelo componente injetor.
  3. Estender o aplicativo se torna mais fácil.
  4. Ajuda a habilitar o acoplamento fraco, o que é importante na programação de aplicativos.

Desvantagens do DI

  1. É um pouco complexo de aprender e, se usado em excesso, pode levar a problemas de gerenciamento e outros problemas.
  2. Muitos erros de tempo de compilação são colocados em tempo de execução.
  3. Os frameworks de injeção de dependência são implementados com reflexão ou programação dinâmica. Isso pode dificultar o uso da automação IDE, como “encontrar referências”, “mostrar hierarquia de chamadas” e refatoração segura.

Você pode implementar injeção de dependência por conta própria (Pure Vanilla) ou usar bibliotecas ou estruturas de terceiros.

Bibliotecas e frameworks que implementam DI

  • Spring (Java)
  • Google Guice (Java)
  • Dagger (Java e Android)
  • Castle Windsor (.NET)
  • Unity (.NET)

Para saber mais sobre injeção de dependência, você pode verificar os recursos abaixo:

Java Dependency Injection - Tutorial de exemplo de DI Design Pattern - JournalDev

Usando injeção de dependência em Java - Introdução - Tutorial - Vogella

Inversão de recipientes de controle e o padrão de injeção de dependência - Martin Fowler

Espero que ajude!

Se você gostou do artigo e quer ler mais artigos incríveis, siga-me aqui (Bhavya Karia) e mostre seu apoio, pois isso me motiva a escrever mais.

Se você tiver alguma dúvida ou feedback para mim, vamos nos conectar no LinkedIn, Twitter, Facebook.

Editar 1:

Graças a Sergey Ufocoder, este artigo foi convertido para o idioma russo. Meus amigos russos e todos que podem ler a língua russa dão uma lida.

Link para o artigo

Além disso, se você deseja aplicar DI em JavaScript e está procurando uma biblioteca, Jo Surikat sugere que você experimente sua biblioteca.

Di-Ninja

Mais uma incrível biblioteca de DI em JavaScript foi sugerida por Nicolas Froidure.

Knifecycle

Editar 2:

Se você é um desenvolvedor PHP, não se preocupe, você também tem tudo para fazer. Gordon Forsythe recomendou esta biblioteca incrível que todos vocês podem querer experimentar.

Auryn

Obrigado por todas as palavras gentis que tenho recebido. Compartilhe o artigo para que mais e mais pessoas possam ser beneficiadas.

Se você aprendeu uma ou duas coisas, por favor, compartilhe esta história!