TLDR
Die empirischen Daten sind irrelevant. Tools und Methoden (wie DI) lösen bestimmte Probleme. Verstehen Sie Ihre Probleme, lernen Sie den Umgang mit den Werkzeugen und es wird deutlich, wann ein Werkzeug wertvoll ist - und Sie können die Ergebnisse prophetischer erklären als alle verallgemeinerten, aggregierten, empirischen Daten.
Und jetzt mit viel mehr Ausführlichkeit ...
Gibt es empirische Beweise?
Sicher wahrscheinlich. Oder zumindest vielleicht. Aber wen interessiert es? Es ist nicht relevant.
Eine statistische Kosten-Nutzen-Analyse von DI mag wissenschaftlich interessant sein, sagt jedoch nicht unbedingt den individuellen Erfolg voraus. Aggregierte Ergebnisse verbergen individuelle Erfolge und Misserfolge. Und ich könnte argumentieren, dass Daten über "evangelische" Praktiken besonders giftig sind. Diese Disziplinen ziehen sowohl Eiferer als auch Narren an, die beide die Nettoauswirkung einer "reinen" Implementierung verschleiern und von denen Sie beide sein könnten !
Woher wissen wir also, dass Abhängigkeitsinjektion überhaupt wertvoll ist ?
Gute Frage! Tatsächlich eine GROSSE Frage. Und ich bin bei Ihnen - ich hasse es, Zeit und Mühe mit dogmatischen "Best Practices" zu verschwenden, die niemand rechtfertigen kann. Ich bin froh, dass Sie gefragt haben.
Uhh. Aber hier ist das peinliche Problem ... Im allgemeinen Begriffen, Sie nicht wissen. Und noch peinlicher ist es, dass Ihr Code durch die Einführung von DI in keiner Weise besser wird.
KEUCHEN!
⊙▃⊙ . . . (╯°□°)╯︵ ┻━┻
...
Vielleicht fragst du dich jetzt ...
Warum sollte ich mir die Mühe machen, dass Dinge nicht ähm bewiesen sind?
Lassen Sie uns zuallererst einfach - auf jeder Seite der Debatte - zur Ruhe kommen. Ich kann Ihnen versichern, dass zwischen Dogmatismus und Skepsis ein wunderschönes Paradies der Vernunft und Besonnenheit liegt. (Und der gelegentliche exzentrische SE.SE-Beitrag.) Und der POAP kann Sie dorthin führen.
... Womit ich meine, das Prinzip der Anwendung von Prinzipien :
Prinzipien, Muster und Praktiken sind keine endgültigen Zwecke. Die gute und ordnungsgemäße Anwendung eines jeden wird daher von einem überlegenen, endgültigeren Zweck inspiriert und eingeschränkt .
Sie müssen verstehen, warum Sie das tun, was Sie tun!
(Der POAP ist nicht vom POAP ausgenommen.)
(Ich würde sagen, "Hervorhebung meiner", aber es ist auf jeden Fall aus meinem eigenen "Blog". Also, es ist alles meins!)
Lassen Sie mich den Hauptpunkt wiederholen: Sie müssen verstehen, warum Sie das tun, was Sie tun.
Und vielleicht ist es zur Verdeutlichung in der Regel nicht sinnvoll, ein bestimmtes "Etwas" (wie "Abhängigkeitsinjektion") zu nehmen und es zu verwenden, ohne bereits zu verstehen, welches Problem es löst - speziell für Sie. Wenn Sie Ihre Probleme verstehen und wissen, wie das "Etwas" (wie DI) funktioniert, wird es einigermaßen "offensichtlich" sein, wie hilfreich das "Etwas" ist, unabhängig davon, was die verallgemeinerten, aggregierten, empirischen Daten nahelegen.
Wenn DI des Hilfs oder un -helpfulness Ihnen nicht klar ist - oder zumindest über Ihre Denkfähigkeit - Sie entweder nicht verstehen , DI, oder Sie nicht über Ihre eigenen Probleme verstehen.
Betrachten wir eine reale "Parabel".
Wir müssen eine Kiste bauen. Wir haben Holz. Wir haben Nägel. Und wir haben zwei Werkzeuge: Einen normalen Klauenhammer und einen Schraubendreher .
Nun können wir einige breite empirische Daten haben, um zu zeigen, dass mit Schraubenziehern hergestellte Kästen insgesamt wesentlich robuster sind als mit Hämmern hergestellte. Aber wenn Sie versuchen, diese Nägel einzuschrauben, werden Sie überhaupt keine Schachtel haben. Und wenn Sie versuchen, sie mit dem Schraubenzieher einzuschlagen, können Sie sie möglicherweise einführen. Dies erfordert jedoch erheblich mehr Zeit und Mühe, und das Endergebnis ist weniger präzise (und robuster) als wenn Sie einfach den Hammer verwendet hätten.
Und wenn Sie schon einmal jemanden gesehen haben, der eines der beiden Tools verwendet, und wenn Sie verstehen, wie eine Box aussieht, liegt die Entscheidung auf der Hand.
Telekinese!
Äh ... hmm ...
Ja, welches Problem löst Dependency Injection?
Es verhindert starren, nicht konfigurierbaren Code, der daher oft nicht testbar ist .
Dies geschieht, indem der Aufruf von Code ermöglicht wird, um zu entscheiden, mit welchen Objekten ein Modul arbeitet. Und ich weiß, dass Sie darüber nachdenken, und Sie haben Recht: Dies ist nicht einmal ein entferntes neues Konzept. Methoden- / Funktionsparameter existieren seit dem Auftreten der Algebra.
Wir haben damit begonnen, die grundlegende Parameterübergabe zu evangelisieren und sie "Abhängigkeitsinjektion" zu nennen, sobald wir genug Code gesammelt und geerbt haben, um unsere Ungleichgewichte zu erkennen. Die Berge von Code, auf denen wir saßen, konnten nicht einfach geändert, getestet oder sogar wiederverwendet werden , nur weil die Abhängigkeiten verborgen waren.
Daher der eifrige Kreuzzug für Abhängigkeitsinjektion ...
K. Aber ich kann gut argumentieren. Warum die Frameworks ?
So wie ich es verstehe, lösen DI- Frameworks in erster Linie das Problem des Boilerplate-Aufbaus (aufgrund von übereifrigen DI, IMO) - insbesondere, wenn für alle Module, die diese benötigen, Standardabhängigkeiten vorhanden sind. DI-Frameworks tun magische (möglicherweise sogar böse!) Dinge, um diese Standardabhängigkeiten einzuschleusen, wenn sie beim Aufruf nicht explizit übergeben werden. (Gleicher Effekt wie ein Service Locator, wenn er auf diese Weise verwendet wird!)
Abhängigkeitsinjektion als "Disziplin" ist eigentlich sehr schwer zu erreichen. Es geht nicht darum, DI zu verwenden oder nicht. es ist eine Sache zu wissen , welche Abhängigkeiten wahrscheinlich ändern oder Notwendigkeit spöttischen sind und Injizieren diejenigen . Und dann ist es eine Frage der Entscheidung, ob DI besser als irgendeine Alternative wie Service Location passt ...
Aber ich möchte Sie dazu ermutigen, es zu googeln , diese SO-Antwort zu lesen , möglicherweise mit einem äußerst erfahrenen und erfolgreichen Entwickler in Ihrer Branche zu sprechen und spezifische Beispiele an CR.SE zu senden .