Na página da Wikipedia sobre injeção de dependência, a seção de desvantagens nos diz o seguinte:
A injeção de dependência aumenta o acoplamento exigindo que o usuário de um subsistema forneça as necessidades desse subsistema.
com um link para um artigo contra injeção de dependência .
A injeção de dependência faz uma classe usar a interface em vez da implementação concreta. Isso deve resultar em menor acoplamento , não?
o que estou perdendo? Como a injeção de dependência está aumentando o acoplamento entre as classes?
dependency-injection
coupling
BЈовић
fonte
fonte
Respostas:
A injeção de dependência diminui o acoplamento entre uma classe e sua dependência. Mas aumenta o acoplamento entre uma classe e seu consumidor (já que o consumidor precisa de mais informações para criá-la) e a dependência e seu consumidor (já que o consumidor precisa saber a dependência a ser usada).
Muitas vezes, essa é uma boa troca. A classe não deve conhecer os detalhes sobre suas dependências além de uma interface e deve ser responsabilidade do aplicativo unir bits específicos de código.
fonte
Suponha que você tenha um subsistema
S
que depende de uma conexão com o banco de dadosD
. Sem injeção de dependência, há um acoplamento relativamente apertado entreS
eD
, porqueS
precisa saber como usarD
e como criá-lo. O restante do sistema, no entanto, pode ignorar alegremente essa dependência entreS
eD
.Com a injeção de dependência, o acoplamento entre
S
eD
se torna mais solto, porque você remove doS
conhecimento como criar umD
.S
só precisa saber como usá-lo. O aumento do acoplamento geral vem do fato de que outras partes do sistema agora precisam conhecerD
e possivelmente como criar um. A extensão desse aumento no acoplamento depende de como a dependênciaD
é injetada noS
:S
precisa de uma dependênciaD
e, possivelmente, do conhecimento de como criar uma.S
pelo qual umD
é injetado precisa de uma dependência deD
e, possivelmente, do conhecimento de como criar um.Em qualquer um dos casos, o número de classes que depende de
D
aumentos e o conhecimento de como criar umaD
ainda precisam estar presentes em algum lugar do sistema. Isso cria um aumento geral do acoplamento.fonte
S
precisa fornecer uma fábricaD
, o que significa que precisa saber queS
usaD
(ou pelo menos alguma interface dela).Eu discordo totalmente que aumenta o acoplamento.
Sem injeção de dependência, você tem um acoplamento rígido entre um subsistema e a implementação concreta da dependência.
Com a injeção de dependência, você separou o subsistema da implementação da dependência.
Argumentar que ele aumenta o acoplamento entre o consumidor e esse subsistema é MUITO questionável, pois implica que o consumidor agora está fortemente acoplado à dependência exigida pelo subsistema. Tudo o que isso significa é que você está escrevendo um código fortemente acoplado que une seu consumidor à dependência. Idealmente, TODO o seu código é dissociado.
Injeção de Construtor:
A resolução de dependência é manipulada por um contêiner de injeção de dependência ou uma fábrica. O consumidor pode obter uma implementação concreta do subsistema do contêiner de injeção de dependência ou de uma fábrica.
O consumidor não precisa saber como é o construtor do subsistema. Não há acoplamento à dependência do subsistema.
Injeção de método:
O mesmo que a injeção do construtor, exceto que agora o consumidor precisa obter uma instância concreta da dependência do contêiner ou da fábrica (ou mesmo que o método / construtor seja injetado) e injetá-lo no método. Novamente, o consumidor não está acoplado a uma implementação concreta da dependência.
TL; DR O pior caso para injeção de dependência em um subsistema é que o acoplamento é alterado para o código do consumidor. NÃO EXISTE AUMENTO GERAL NO ACOPLAMENTO.
O melhor caso é que agora todos os sistemas estão fracamente acoplados e a injeção de dependência é controlada através de contêineres ou fábricas de injeção de dependência.
fonte