Ich arbeite an einem Design, stoße aber immer wieder auf eine Straßensperre. Ich habe eine bestimmte Klasse (ModelDef), die im Wesentlichen der Eigentümer eines komplexen Knotenbaums ist, der durch Analysieren eines XML-Schemas (Think DOM) erstellt wurde. Ich möchte guten Konstruktionsprinzipien (SOLID) folgen und sicherstellen, dass das resultierende System leicht testbar ist. Ich habe die Absicht, DI zu verwenden, um Abhängigkeiten an den Konstruktor von ModelDef zu übergeben (damit diese bei Bedarf während des Testens problemlos ausgetauscht werden können).
Womit ich jedoch zu kämpfen habe, ist die Erstellung des Knotenbaums. Dieser Baum wird ganz aus einfachen "Wert" -Objekten bestehen, die nicht unabhängig getestet werden müssen. (Möglicherweise übergebe ich trotzdem eine abstrakte Factory an ModelDef, um die Erstellung dieser Objekte zu unterstützen.)
Aber ich lese immer wieder, dass ein Konstruktor keine echte Arbeit leisten sollte (zB Fehler: Konstruktor leistet echte Arbeit ). Das ist für mich sehr sinnvoll, wenn "echte Arbeit" bedeutet, schwergewichtige Objekte zu konstruieren, die man möglicherweise später zum Testen herausnehmen möchte. (Diese sollten über DI übergeben werden.)
Aber was ist mit leichtgewichtigen Objekten wie diesem Knotenbaum? Der Baum muss irgendwo angelegt werden, oder? Warum nicht über den Konstruktor von ModelDef (z. B. mit einer buildNodeTree () -Methode)?
Ich möchte den Knotenbaum nicht wirklich außerhalb von ModelDef erstellen und dann (über Konstruktor DI) übergeben, da das Erstellen des Knotenbaums durch Analysieren des Schemas eine erhebliche Menge an komplexem Code erfordert - Code, der gründlich getestet werden muss . Ich möchte es nicht zum "Kleben" von Code degradieren (was relativ trivial sein sollte und wahrscheinlich nicht direkt getestet wird).
Ich habe darüber nachgedacht, den Code zum Erstellen des Knotenbaums in ein separates "Builder" -Objekt einzufügen, zögere jedoch, ihn als "Builder" zu bezeichnen, da er nicht wirklich mit dem Builder-Muster übereinstimmt (das anscheinend mehr mit der Beseitigung des Teleskopierens zu tun hat) Konstrukteure). Aber selbst wenn ich es etwas anderes nannte (z. B. NodeTreeConstructor), fühlt es sich immer noch wie ein Hack an, nur um zu vermeiden, dass der ModelDef-Konstruktor den Knotenbaum erstellt. Es muss irgendwo gebaut werden; Warum nicht in dem Objekt, das es besitzen wird?