Beim Entwerfen eines Systems stehe ich häufig vor dem Problem, dass eine Reihe von Modulen (Protokollierung, Datenbankzugriff usw.) von den anderen Modulen verwendet werden. Die Frage ist, wie ich diese Komponenten anderen Komponenten zur Verfügung stelle. Zwei Antworten erscheinen als mögliche Abhängigkeitsinjektion oder unter Verwendung des Factory-Musters. Beide scheinen jedoch falsch zu sein:
- Fabriken machen das Testen zum Problem und ermöglichen kein einfaches Austauschen von Implementierungen. Sie machen auch keine Abhängigkeiten sichtbar (z. B. untersuchen Sie eine Methode, ohne zu bemerken, dass sie eine Methode aufruft, die eine Methode aufruft, die eine Methode aufruft, die eine Datenbank verwendet).
- Die Dependecy-Injektion vergrößert Konstruktorargumentlisten massiv und verschmiert einige Aspekte im gesamten Code. Typischerweise sehen Konstrukteure von mehr als einer halben Klasse so aus
(....., LoggingProvider l, DbSessionProvider db, ExceptionFactory d, UserSession sess, Descriptions d)
Hier ist eine typische Situation, mit der ich ein Problem habe: Ich habe Ausnahmeklassen, die Fehlerbeschreibungen verwenden, die aus der Datenbank geladen wurden. Dabei wird eine Abfrage verwendet, die Parameter für die Benutzerspracheneinstellung enthält und sich im Benutzersitzungsobjekt befindet. Um eine neue Ausnahme zu erstellen, benötige ich eine Beschreibung, die eine Datenbanksitzung und die Benutzersitzung erfordert. Daher bin ich dazu verdammt, all diese Objekte über alle meine Methoden zu ziehen, nur für den Fall, dass ich eine Ausnahme auslösen muss.
Wie gehe ich ein solches Problem an?