Estou trabalhando em um design, mas continue atingindo um obstáculo. Eu tenho uma classe específica (ModelDef) que é essencialmente o proprietário de uma árvore de nó complexa criada pela análise de um esquema XML (pense em DOM). Desejo seguir os bons princípios de design (SOLID) e garantir que o sistema resultante seja facilmente testável. Eu tenho toda a intenção de usar o DI para passar dependências para o construtor de ModelDef (para que elas possam ser facilmente trocadas, se necessário, durante o teste).
No entanto, estou lutando com a criação da árvore de nós. Essa árvore será composta inteiramente de objetos simples de "valor" que não precisarão ser testados independentemente. (No entanto, ainda posso passar uma Abstract Factory para o ModelDef para ajudar na criação desses objetos.)
Mas continuo lendo que um construtor não deve fazer nenhum trabalho real (por exemplo, Falha: Construtor faz um trabalho real ). Isso faz todo o sentido para mim, se "trabalho real" significa construir objetos dependentes de peso pesado que mais tarde você pode querer esboçar para teste. (Esses devem ser repassados via DI.)
Mas e os objetos de valor leve, como essa árvore de nós? A árvore tem que ser criada em algum lugar, certo? Por que não através do construtor de ModelDef (usando, digamos, um método buildNodeTree ())?
Eu realmente não quero criar a árvore de nós fora do ModelDef e depois passá-la (via construtor DI), porque criar a árvore de nós analisando o esquema requer uma quantidade significativa de código complexo - código que precisa ser exaustivamente testado . Não quero relegá-lo para "colar" o código (que deve ser relativamente trivial e provavelmente não será testado diretamente).
Pensei em colocar o código para criar a árvore de nós em um objeto "construtor" separado, mas hesite em chamá-lo de "construtor", porque realmente não corresponde ao padrão do construtor (que parece estar mais preocupado em eliminar a telescopia) construtores). Mas mesmo que eu chamei de algo diferente (por exemplo, NodeTreeConstructor), ainda parece um hack apenas para evitar que o construtor ModelDef construa a árvore de nós. Tem que ser construído em algum lugar; por que não no objeto que o possui?