2009-04-19 6 views
3

Ich habe durch Misko Heverys Guide: Writing Testable Code gelesen.Wer ist verantwortlich für das Anhängen von Listenern in einem Injizierungsschema ohne Initialisierung?

Ich kaufe auf jeden Fall in Abhängigkeitsinjektion als ein großartiges Werkzeug, um die Testbarkeit zu verbessern, und verwenden Sie es sehr in meinem Code. Wenn ich jedoch den ersten Teil des Handbuchs "Flaw #1: Constructor does Real Work" lese, finde ich, dass ich immer noch ein wenig verschwommen darüber bin, wie man Hörer-Hörer mit Kabel verbinden soll.

Nehmen wir an, ich habe eine Klasse, die, um richtig zu funktionieren, einen Listener an eines der Argumente anhängen muss, das über Konstruktor-Abhängigkeitsinjektion übergeben wird. Laut dem Handbuch sollte der Konstruktor seine Argumente nur den Membervariablen zuweisen und keine anderen Aufgaben ausführen. Darüber hinaus sollte das Objekt vollständig initialisiert werden, wenn der Konstruktor beendet wird. In diesem Fall würde das Objekt jedoch nicht vollständig initialisiert werden, es sei denn, es ist erforderlich, dass Zuhörer angeschlossen sind.

So weit ich sagen kann, erfordert dies die Anbindung aller Listener im Builder oder Factory, obwohl dies scheint sehr vom Objekt selbst entkoppelt, und leicht aus der Synchronisation geraten. Zusätzlich dazu (zumindest in Actionscript, wo ich die meiste Zeit in diesen Tagen verbringe), würde dies bedeuten, dass meine Ereignis-Listener nicht länger privat sein könnten, da der Hersteller/Fabrikant sie sehen müsste.

Was ist der beste Weg, damit umzugehen? Gibt es eine andere Option, die ich hier vermisse?

+0

Wie hoch ist die Lebensdauer der Listener-Objekte? Leben sie länger als dein Hauptobjekt? Wenn sie eine kürzere Lebensdauer haben als das Hauptobjekt, sollten sie nicht über den Konstruktor übergeben werden. – Runcible

Antwort

1

Trennen Sie die Business-Logik (Call Graph) von Objekterstellung

Konkret: Wenn House ein Kitchen initialisiert, um erfordert korrekt zu funktionieren, ein initialisiert Kitchen sollte in den House Konstruktor übergeben werden.

House sollte nicht für die Initialisierung Kitchen verantwortlich sein. Das ist die Verantwortung eines anderen. (Vermutlich wer auch immer die Küche an erster Stelle gebaut hat.)

Allerdings gibt es eine kleine gotcha: Wenn das Objekt eine kürzere Lebensdauer als House hat, gehört es nicht als Member-Variable. Zum Beispiel: Person oder Owner sollte wahrscheinlich nicht über den Konstruktor übergeben werden. Es sollte über Funktionsaufrufe übergeben werden.

Misko's latest article on managing object lifetimes talks about this subject.

1

Ein übliches Muster ist die Verdrahtung in eine initialize() oder Start() -Methode zu bewegen, und nutzen Sie Ihre Abhängigkeit Lifecycle-Mechanismus des Injektionsbehälters, um sicherzustellen, wird die Methode aufgerufen.

Auf meinem aktuellen Projekt kombinieren wir Anmerkungen mit Frühlings- und Bohne Postprozessoren der Spring.NET Ereignis-Listener Methoden verkabeln.

Verwandte Themen