Я працюю над дизайном, але продовжуйте вражати блокпост. У мене є особливий клас (ModelDef), який по суті є власником складного дерева вузлів, побудованого за допомогою аналізу XML-схеми (думаю, DOM). Я хочу дотримуватися принципів хорошого дизайну (SOLID) та забезпечити легку перевірку отриманої системи. У мене є всі наміри використовувати DI для передачі залежностей в конструктор ModelDef (щоб вони могли легко бути замінені, якщо потрібно, під час тестування).
З чим я боюся, - це створення дерева вузлів. Це дерево повністю буде складено з простих "ціннісних" об'єктів, які не потрібно буде самостійно перевіряти. (Однак я все-таки можу передати абстрактний завод у ModelDef, щоб допомогти у створенні цих об'єктів.)
Але я постійно читаю, що конструктор не повинен робити жодної реальної роботи (наприклад, Flaw: Constructor виконує справжню роботу ). Це має для мене ідеальний сенс, якщо "реальна робота" означає побудову об'єктів, що залежать від важкої ваги, які згодом можна буде заглушити для тестування. (Вони повинні бути передані через DI.)
А як щодо об’єктів малої ваги, таких як це дерево вузлів? Дерево треба десь створити, правда? Чому б не через конструктор ModelDef (використовуючи, скажімо, метод buildNodeTree ())?
Я не дуже хочу створити дерево вузла поза ModelDef, а потім передати його (через конструктор DI), тому що для створення дерева вузлів шляхом розбору схеми потрібна значна кількість складного коду - коду, який потрібно ретельно перевірити . Я не хочу переносити його на "склеювати" код (який повинен бути відносно тривіальним і, швидше за все, не буде безпосередньо перевірений).
Я думав поставити код для створення дерева вузлів в окремому об'єкті "builder", але соромтеся називати його "будівельником", оскільки він насправді не відповідає шаблону Builder (який, здається, більше стосується усунення телескопізації конструктори). Але навіть якби я назвав це чимось іншим (наприклад, NodeTreeConstructor), він все ще відчуває себе трохи злому, щоб уникнути того, щоб конструктор ModelDef будував дерево вузлів. Це треба десь будувати; чому б не в об’єкті, який збирається ним володіти?