Я работаю над дизайном, но продолжаю преодолевать препятствия. У меня есть определенный класс (ModelDef), который по сути является владельцем сложного дерева узлов, созданного путем анализа XML-схемы (например, DOM). Я хочу следовать хорошим принципам проектирования (SOLID) и гарантировать, что полученная система легко тестируется. У меня есть все намерения использовать DI для передачи зависимостей в конструктор ModelDef (чтобы их можно было легко заменить при необходимости во время тестирования).
Однако я борюсь с созданием дерева узлов. Это дерево будет полностью состоять из простых «ценностных» объектов, которые не нужно будет проверять независимо. (Тем не менее, я все еще могу передать Абстрактную Фабрику в ModelDef, чтобы помочь в создании этих объектов.)
Но я продолжаю читать, что конструктор не должен выполнять какую-либо реальную работу (например, Flaw: Constructor делает реальную работу ). Это имеет смысл для меня, если «настоящая работа» означает создание тяжелых зависимых объектов, которые позже можно было бы заглушить для тестирования. (Они должны быть переданы через DI.)
Но как насчет легких объектов значений, таких как это дерево узлов? Дерево должно быть где-то создано, верно? Почему не через конструктор ModelDef (используя, скажем, метод buildNodeTree ())?
Я действительно не хочу создавать дерево узлов вне ModelDef, а затем передавать его (через конструктор DI), потому что создание дерева узлов путем синтаксического анализа схемы требует значительного количества сложного кода - кода, который необходимо тщательно протестировать , Я не хочу отрицать это, чтобы «склеить» код (который должен быть относительно тривиальным и, скорее всего, не будет напрямую проверен).
Я думал о том, чтобы поместить код для создания дерева узлов в отдельный объект «строитель», но стесняюсь называть его «строитель», потому что он на самом деле не соответствует шаблону построителя (который, как представляется, больше касается устранения телескопирования). конструкторы). Но даже если бы я назвал это как-то по-другому (например, NodeTreeConstructor), он все равно выглядит как хак, просто чтобы избежать конструктора ModelDef для построения дерева узлов. Это должно быть где-то построено; почему не в объекте, который будет владеть им?