2 Stimmen

Dependency Injection ODER Konfigurationsobjekt?

Ich habe den folgenden Konstruktor für meine Klasse

 public MyClass(File f1, File f2, File f3, Class1 c1, Class2 c2, Class3 c3)
{
..........
}

Wie man sieht, hat sie 6 Parameter. Als ich diesen Code sah, sagte einer meiner Vorgesetzten, dass ich statt der 6 Parameter lieber ein Konfigurationsobjekt übergeben sollte.

Ich habe den Code so geschrieben, weil ich vor kurzem über "Dependency Injection" gelesen habe, die besagt, dass "Klassen nach dem fragen müssen, was sie wollen". Ich denke also, dass die Übergabe eines Konfigurationsobjekts gegen dieses Prinzip verstößt.

Ist meine Interpretation von "Dependency Injection" richtig? ODER sollte ich den Rat meines Vorgesetzten befolgen?

9voto

Bryan Watts Punkte 43539

Der Begriff "Konfigurationsobjekt" ist in dieser Situation sehr unpassend, da er Ihre Bemühungen in einem rein mechanischen Sinne beschreibt. Das Ziel ist es, dem Verbraucher der Klasse Ihre Absicht mitzuteilen; lassen Sie uns in diese Richtung refaktorisieren.

Methoden oder Konstruktoren mit zahlreichen Parametern weisen auf eine lose Beziehung zwischen ihnen hin. Der Verbraucher muss im Allgemeinen mehr Schlussfolgerungen ziehen, um die API zu verstehen. Was ist das Besondere an diese 3 Dateien zusammen mit diese 3 Klassen ? Das ist die Information, die nicht mitgeteilt wird.

Dies ist eine Gelegenheit, eine aussagekräftigere und die Absicht verdeutlichende Schnittstelle zu schaffen, indem ein explizites Konzept aus einem impliziten extrahiert wird. Wenn die 3 Dateien zum Beispiel wegen eines Benutzers zusammenhängen, kann ein UserFileSet Parameter würde dies deutlich zum Ausdruck bringen. Vielleicht f1 ist verwandt mit c1 , f2 zu c2 und f3 zu c3 . Die Deklaration dieser Assoziationen als unabhängige Klassen würde die Anzahl der Parameter halbieren und die Menge der Informationen erhöhen, die von Ihrer API abgeleitet werden können.

Letztendlich hängt das Refactoring stark von Ihrem Problembereich ab. Gehen Sie nicht davon aus, dass Sie ein einzelnes Objekt erstellen sollten, um eine Parameterliste zu erfüllen, sondern versuchen Sie, die Umstrukturierung entlang der Beziehungen zwischen den Parametern vorzunehmen. Dies wird immer zu einem Code führen, der das zu lösende Problem besser widerspiegelt als die Sprache, in der es gelöst wird.

2voto

Tomas Vana Punkte 17297

Ich denke nicht, dass die Verwendung eines Konfigurationsobjekts der Verwendung des Dependency Injection Patterns widerspricht. Es geht eher um die Form, in der Sie Ihre Abhängigkeiten injizieren, und um die allgemeine Frage, ob es besser ist, eine Funktion (in diesem Fall den Konstruktor) zu haben, die 20 Parameter benötigt, oder diese Parameter in einer Klasse zu kombinieren, damit sie gebündelt werden.

Es steht Ihnen immer noch frei, Dependency Injection zu verwenden, d.h. das Konfigurationsobjekt durch eine Fabrik oder einen Container zu konstruieren und es in den Konstruktor zu injizieren, wenn Sie eine Instanz Ihrer Klasse erzeugen. Ob das eine gute Idee ist oder nicht, hängt auch vom jeweiligen Fall ab, es gibt keine Patentrezepte ;)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X