Sto lavorando a un progetto, ma continuo a colpire un blocco stradale. Ho una classe particolare (ModelDef) che è essenzialmente il proprietario di un albero nodo complesso creato analizzando uno schema XML (pensa DOM). Voglio seguire i buoni principi di progettazione (SOLID) e garantire che il sistema risultante sia facilmente testabile. Ho tutte le intenzioni di usare DI per passare dipendenze nel costruttore di ModelDef (in modo che queste possano essere facilmente sostituite, se necessario, durante i test).
Ciò con cui sto lottando, tuttavia, è la creazione dell'albero dei nodi. Questo albero sarà composto interamente da semplici oggetti "di valore" che non dovranno essere testati in modo indipendente. (Tuttavia, potrei ancora passare una Fabbrica astratta in ModelDef per aiutare con la creazione di questi oggetti.)
Ma continuo a leggere che un costruttore non dovrebbe fare alcun lavoro reale (es. Flaw: Costruttore fa il vero lavoro ). Questo ha perfettamente senso per me se "lavoro reale" significa costruire oggetti dipendenti di peso elevato che uno potrebbe voler stub per testare. (Questi dovrebbero essere passati tramite DI.)
Ma che dire degli oggetti di valore leggero come questo albero dei nodi? L'albero deve essere creato da qualche parte, giusto? Perché non tramite il costruttore di ModelDef (usando, per esempio, un metodo buildNodeTree ())?
Non voglio davvero creare l'albero dei nodi al di fuori di ModelDef e poi passarlo (tramite il costruttore DI), perché la creazione dell'albero dei nodi analizzando lo schema richiede una quantità significativa di codice complesso - codice che deve essere testato a fondo . Non voglio relegarlo al codice "colla" (che dovrebbe essere relativamente banale e probabilmente non verrà testato direttamente).
Ho pensato di inserire il codice per creare l'albero dei nodi in un oggetto "builder" separato, ma esito a chiamarlo "builder", perché non corrisponde realmente al Builder Pattern (che sembra essere più interessato all'eliminazione del telescoping costruttori). Ma anche se l'ho chiamato in modo diverso (ad es. NodeTreeConstructor), sembra comunque un po 'un trucco solo per evitare che il costruttore ModelDef costruisca l'albero dei nodi. Deve essere costruito da qualche parte; perché non nell'oggetto che lo possiede?