Dies ist eher eine Nomenklatur (technisches Schreiben) als eine rein technische Frage. Ich versuche, ein Refactoring-Angebot zu schreiben (und es mir selbst zuweisen zu lassen), in dessen Mittelpunkt die Erweiterung der Abhängigkeitsinjektion in unserer Anwendung steht. Während wir Spring für das automatische Verdrahten von Bohnen verwenden, gibt es immer noch Instanzen, die die Verwendung von Bohnen instantiieren MyClass obj = new MyClass(...)
und die vollständig injiziert werden könnten. Ich möchte meinen Vorschlag mit einer eleganten Nomenklatur versehen und mit einem richtigen Begriff auf das gegenüberliegende Entwurfsmuster von DI verweisen.
Ist "enge Kopplung" ein adäquater Begriff, der als Antonyme auf DI steht?
terminology
refactoring
dependency-injection
amphibient
quelle
quelle
Antworten:
Enge Kopplung ist viel mehr als das, womit Abhängigkeitsinjektion zu tun hat.
Die Abhängigkeitsinjektion externalisiert eine Entscheidung über die Implementierung. Dies ist ein langer Weg zur Entkopplung, aber die Kopplung ist mehr als nur das.
Ein gutes Antonyme für die Abhängigkeitsinjektion ist die harte Codierung einer Abhängigkeit . Wenn Sie ein Verhaltensobjekt konstruieren (neue verwenden oder eine Factory direkt verwenden), haben Sie zwei verschiedene Aspekte zusammengeführt. Ein Service-Locator hilft beim Entkoppeln, lässt Sie jedoch mit dem Service-Locator selbst verbunden.
Kupplung ist mehr als nur eine Trennung von Konstruktion und Verhalten. Wenn ich 101 Methoden habe, die in einer bestimmten Reihenfolge von Klasse A bis Klasse B aufgerufen werden müssen, bin ich eng miteinander verbunden. Es spielt keine Rolle, wie wunderbar Konstruktion und Verhalten voneinander getrennt sind.
Die Kopplung ist ein Maß für die gegenseitige Abhängigkeit der beiden Objekte. Alles, was dazu beiträgt, Änderungen an einem zu erschweren, ohne den anderen zu beeinträchtigen, trägt zur Kopplung bei. Die Abhängigkeitsinjektion hilft dabei, aber das ist noch nicht alles.
quelle
N
stundenlang für die Öffentlichkeit verborgen bleiben ... oder bis eine Antwort ausgewählt wird. Ich weiß, dass ich nicht ganz objektiv bin, wenn eine Antwort bereits 10 Stimmen hat und die anderen 5 Antworten keine haben!Genau genommen ist die Abhängigkeitsinjektion nur wirklich gegen die NICHT- Abhängigkeitsinjektion und daher gegen jede Abhängigkeitsverwaltungsstrategie, die keine Abhängigkeitsinjektion ist.
[Unerwünschte] Kopplung ist zwar kein genaues orthogonales Problem, kann jedoch in beiden Fällen auftreten oder verringert werden. Diese sind beide gekoppelt an
DependencyClass
:DependencyLookupConstructor
istDependencyClass
in diesem Fall an ein bestimmtes gekoppelt . Aber sie sind beide verbunden mitDependencyClass
. Das wahre Übel, wenn es eines hier gibt, ist nicht unbedingt die Kopplung, esDependencyLookupConstructor
muss sich ändern, wennDependencyClass
plötzlich seine eigenen Abhängigkeiten injiziert werden müssen 1 .Jedoch wird dieser Konstruktor / Klasse noch mehr lose gekoppelten:
Wenn Sie in C # arbeiten, wird die oben Ihre erlauben
ServiceLocator
zurückzukehren etwas , wennGetMyDoer()
aufgerufen wird, solange es hat können ,do()
wasDependencyLocatingConstructor
es hatdo()
. Sie erhalten den Vorteil der Signaturvalidierung zur Kompilierungszeit, ohne an eine vollständige Schnittstelle 2 gekoppelt zu sein .Also, nimm dein Gift.
Aber im Grunde, wenn es ein konkretes „Gegenteil“ von Dependency Injection, wäre es etwas anderes im Bereich der seine „Dependency - Management - Strategien.“ Wenn Sie im Gespräch eine der folgenden Methoden verwenden, wird dies unter anderem als NICHT- Abhängigkeitsinjektion erkannt :
1. Ironischerweise sind einige der Probleme, die DI auf höheren Ebenen löst, eine Folge der [Über-] Verwendung von DI auf niedrigeren Ebenen. Ich habe die Freude an der Arbeit auf Codebases mit unnötiger Komplexität hatte überall als Folge der Unterbringung der Handvoll von Orten , an denen die Komplexität tatsächlich geholfen ... Ich bin zwar durch schlechte Belichtung vorgespannt ist .
2. Die Verwendung des Service-Standorts ermöglicht es Ihnen auch, verschiedene Abhängigkeiten desselben Typs durch ihre funktionale Rolle im aufrufenden Code zu spezifizieren , während Sie weitgehend unabhängig davon sind, wie die Abhängigkeit aufgebaut ist. Angenommen, Sie müssen
User
oderIUser
für verschiedene Zwecke lösen : ZBLocator.GetAdministrator()
versusLocator.GetAuthor()
- oder was auch immer. Mein Code kann nach den funktionalen Anforderungen fragen, ohne zu wissen, welche Schnittstellen er unterstützt.quelle
DependencyInjectedConstructor(DependencyClass dep)
ist, dass DependencyClass eine Schnittstelle oder eine abstrakte Klasse sein könnte. Aus diesem Grund macht es mich traurig, dass C # -Codierer wie in ein Schnittstellenpräfix verwendenIDependency
. Als Kunde ist es nicht meine Sache, was diese Abhängigkeitssache ist. Solange ich es nicht baue, muss ich nur wissen, wie ich damit reden soll. Was es ist, ist das Problem eines anderen.DependencyClass
überhaupt eine abstrakte Schnittstelle sein. Es ist nur erforderlich, dass die Konstruktions- / Konfigurations- / Standortlogik "woanders" vorhanden ist. ... Nun, und was die Fragedynamic
Parameter akzeptieren . (Aber nichtvar
Parameter, wenn der Speicher dient.) Also, mit DI in C #, ich glaube , ich entweder Code gegen eine Schnittstelle haben, oder ich muss völlig forgo die Kompilierung-Validierung.dynamic
odervar
und dem Abrufen eines Objekts von einem Locator die Schnittstelle ignorieren und eine beliebige Klasse verwenden, diedo()
Ihren Anforderungen entspricht, unabhängig davon, ob diese Klasse eineIDoer
Schnittstelle implementiert . Mit anderen Worten, wenn wir A-> B <-C haben, entkoppelt DI A von C, erfordert jedoch, dass sowohl A als auch C an B gekoppelt sind, und verhindert die Verwendung von D, selbst wenn D dies willdo()
.Ich weiß nicht , dass es bestimmte, allgemein anerkannte Industrie Terminologie, aber Alternativen , die den Sinn kommen , sind interne Instanzerstellung , interne Abhängigkeiten Erstellung , lokale Abhängigkeiten oder lokal scoped Abhängigkeiten .
quelle
instance creation
aber es ist nicht spezifisch genug. DI erstellt Instanzen, jedoch über den Controller und nicht auf Anwendungsebene. Vielleichtinternal instance creation
Ich würde mit Abhängigkeitsverkapselung gehen . Dies drückt aus, dass die Abhängigkeit gesperrt ist, anstatt zu besuchen und wieder zu verlassen.
quelle