Estoy trabajando en un diseño, pero sigo llegando a un obstáculo. Tengo una clase particular (ModelDef) que es esencialmente el propietario de un árbol de nodos complejo construido al analizar un esquema XML (piense en DOM). Quiero seguir buenos principios de diseño (SÓLIDO) y asegurarme de que el sistema resultante sea fácilmente comprobable. Tengo toda la intención de usar DI para pasar dependencias al constructor de ModelDef (para que estas puedan cambiarse fácilmente, si es necesario, durante las pruebas).
Sin embargo, con lo que estoy luchando es con la creación del árbol de nodos. Este árbol estará compuesto completamente por objetos simples de "valor" que no necesitarán ser probados independientemente. (Sin embargo, aún puedo pasar una Fábrica abstracta a ModelDef para ayudar con la creación de estos objetos).
Pero sigo leyendo que un constructor no debe hacer ningún trabajo real (por ejemplo, Falla: el constructor hace un trabajo real ). Esto tiene mucho sentido para mí si "trabajo real" significa la construcción de objetos dependientes de gran peso que luego uno podría querer probar. (Deben pasarse a través de DI).
Pero, ¿qué pasa con los objetos de valor ligero como este árbol de nodos? El árbol tiene que ser creado en alguna parte, ¿verdad? ¿Por qué no a través del constructor de ModelDef (usando, por ejemplo, un método buildNodeTree ())?
Realmente no quiero crear el árbol de nodos fuera de ModelDef y luego pasarlo (a través del constructor DI), porque crear el árbol de nodos analizando el esquema requiere una cantidad significativa de código complejo, código que debe ser probado a fondo . No quiero relegarlo al código "pegado" (que debería ser relativamente trivial y probablemente no se probará directamente).
He pensado poner el código para crear el árbol de nodos en un objeto "constructor" separado, pero dudo en llamarlo "constructor", porque realmente no coincide con el Patrón de constructor (que parece estar más preocupado por eliminar el telescopio) constructores). Pero incluso si lo llamé algo diferente (por ejemplo, NodeTreeConstructor), todavía se siente como un truco solo para evitar que el constructor ModelDef construya el árbol de nodos. Tiene que ser construido en alguna parte; ¿Por qué no en el objeto que lo va a poseer?