Sto lavorando a un progetto, ma continuo a colpire un posto di blocco. Ho una particolare classe (ModelDef) che è essenzialmente il proprietario di un albero nodo complesso costruito analizzando uno schema XML (penso DOM). Voglio seguire i buoni principi di progettazione (SOLID) e garantire che il sistema risultante sia facilmente verificabile. Ho tutte le intenzioni di usare DI per passare le dipendenze nel costruttore di ModelDef (in modo che possano essere facilmente sostituite, se necessario, durante i test).
Ciò di cui sto combattendo, però, è 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 comunque passare una Fabbrica astratta in ModelDef per aiutare nella creazione di questi oggetti.)
Ma continuo a leggere che un costruttore non dovrebbe fare alcun vero lavoro (es. Flaw: Constructor esegue Real Work ). Questo ha perfettamente senso per me se "lavoro reale" significa costruire oggetti dipendenti pesanti che si potrebbero voler in seguito testare. (Questi dovrebbero essere passati tramite DI.)
Ma per quanto riguarda gli 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, ad esempio, un metodo buildNodeTree ())?
Non voglio veramente creare l'albero dei nodi al di fuori di ModelDef e poi passarlo (tramite il DI costruttore del costruttore), perché la creazione dell'albero del nodo analizzando lo schema richiede una quantità significativa di codice complesso - codice che deve essere accuratamente testato Non voglio relegarlo a codice "incollato" (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 esita a chiamarlo un "builder", perché in realtà non corrisponde al Pattern Builder (che sembra essere più interessato con l'eliminazione dei costruttori telescopici). Ma anche se l'ho chiamato qualcosa di diverso (ad esempio NodeTreeConstructor), sembra ancora un po 'un trucco per evitare che il costruttore ModelDef costruisca la struttura dei nodi. Deve essere costruito da qualche parte; perché non nell'oggetto che lo possiederà?