TLDR
Os dados empíricos são irrelevantes. Ferramentas e práticas (como DI) resolvem problemas particulares . Entenda seus problemas, aprenda a usar as ferramentas e ficará óbvio quando uma ferramenta é valiosa - e você poderá explicar os resultados de maneira muito mais profética do que qualquer dado empírico generalizado, agregado.
E agora, com muito mais verbosidade ...
Existe evidência empírica?
Claro, provavelmente. Ou pelo menos talvez. Mas quem se importa? Não é relevante.
Uma análise estatística de custo-benefício da DI pode ser interessante academicamente, mas não necessariamente prevê o sucesso individual. Os resultados agregados ocultam sucessos e falhas individuais . E, eu poderia argumentar que dados sobre práticas "evangélicas" são particularmente venenosas. Essas disciplinas tendem a atrair fanáticos e tolos, os quais obscurecem o impacto líquido de uma implementação "pura" e qualquer um dos quais você poderia ser!
Então, como sabemos que a injeção de dependência é valiosa ?
Boa pergunta! Ótima pergunta, de fato. E estou com você - odeio perder tempo e esforço mental com as "melhores práticas" dogmáticas que ninguém pode justificar. Então, estou feliz que você perguntou.
Uhh Mas, aqui está o problema embaraçoso ... Em termos gerais , você não sabe. E, ainda mais embaraçoso, seu código pode não melhorar de forma alguma ao introduzir o DI.
SUSPIRO!
⊙▃⊙ . . . (╯°□°)╯︵ ┻━┻
...
Então, talvez agora você esteja se perguntando ...
Por que eu deveria me preocupar com coisas que não foram provadas?
Primeiro de tudo, vamos todos - em todos os lados do debate - nos acalmar. Posso assegurar-lhe que entre o dogmatismo e o ceticismo existe um belo paraíso da razão e da empatia. (E o ocasional excêntrico SE.SE post.) E o POAP pode levá-lo até lá.
... Com o que quero dizer, o Princípio de Aplicação de Princípios :
Princípios, padrões e práticas não são propósitos finais. A boa e adequada aplicação de cada um é, portanto, inspirada e restringida por um propósito superior e mais final.
Você precisa entender por que está fazendo o que está fazendo!
(O POAP não está isento do POAP.)
(Eu diria "ênfase minha", mas é do meu próprio "blog" de qualquer maneira. Portanto, é todo meu!)
Deixe-me reiterar o ponto principal: você precisa entender por que está fazendo o que está fazendo.
E, talvez, para esclarecer, geralmente não faz sentido usar "algo" (como injeção de dependência) e usá-lo sem entender o problema que ele resolve - especificamente para você. Se você entender seus problemas e como o "algo" (como DI) funciona, será um pouco "óbvio" o quão útil é o "algo", muito independentemente do que os dados empíricos generalizados, agregados e sugeridos.
Se a ajuda ou a falta de ajuda de DI para você não é óbvia - ou pelo menos além de seus poderes de raciocínio - você não entende DI, ou não entende seus próprios problemas.
Vamos considerar uma "parábola" do mundo real.
Precisamos construir uma caixa. Nós temos madeira. Temos unhas. E temos duas ferramentas: um martelo de garra padrão e uma chave de fenda .
Agora, podemos ter alguns dados empíricos amplos para mostrar que as caixas construídas com chaves de fenda são caixas significativamente mais robustas em geral, em comparação com aquelas construídas com martelos. Mas, se você tentar aparafusar essas unhas, não terá uma caixa. E, se você tentar encaixá-los com a chave de fenda, poderá obtê-los; mas, exigirá muito mais tempo e esforço, e o resultado final será menos preciso (e robusto) do que você simplesmente usou o martelo.
E, se você já viu alguém usar uma dessas ferramentas antes e se entende como é uma caixa, a decisão é óbvia.
Telecinese!
Err ... hmm ...
Sim, então, que problema a Dependency Injection resolve?
Ele trabalha para evitar códigos rígidos e não configuráveis, que geralmente são, portanto, não testáveis .
Ele faz isso permitindo que o código de chamada decida com quais objetos um módulo opera. E sei que você está pensando e está certo: esse nem é um conceito remotamente novo. Os parâmetros de método / função existem desde que a álgebra aconteceu.
Começamos a evangelizar a passagem básica de parâmetros, chamando-a de "Injeção de Dependência", uma vez que acumulamos e herdamos código suficiente para ver nossos desequilíbrios. As montanhas de código em que estávamos sentados não podiam ser facilmente alteradas, testadas ou até reutilizadas , simplesmente porque as dependências estavam ocultas.
Portanto, a cruzada zelosa pela injeção de dependência ...
K. Mas posso passar argumentos muito bem. Por que os frameworks ?
Pelo que entendi, as estruturas de DI resolvem principalmente o problema de acúmulo de clichê (devido a DI, IMO excessivamente zeloso) - principalmente quando existem dependências "padrão" padrão para todos os módulos que precisam deles. As estruturas de DI fazem coisas mágicas (potencialmente até impertinentes!) Para inserir essas dependências padrão quando não são explicitamente transmitidas no ponto de invocação. (Mesmo efeito que um localizador de serviço quando usado dessa maneira, lembre-se!)
A injeção de dependência, como uma "disciplina", é realmente muito difícil de acertar. Não é uma questão de usar DI ou não; é uma questão de saber quais dependências provavelmente mudarão ou precisarão zombar e injetar essas dependências . E então, é questão de decidir se o DI se encaixa melhor do que alguma alternativa, como Localização do Serviço ...
Mas, eu encorajá-lo a Google-lo , talvez ver esta resposta SO , possivelmente falar com um desenvolvedor super-experiente e bem sucedido em sua indústria, e os exemplos posto específico para CR.SE .