Desculpas se "Hierarquia da composição" não é uma coisa, mas vou explicar o que quero dizer com isso na pergunta.
Não há programador de OO que não tenha encontrado uma variação de "Manter hierarquias de herança planas" ou "Preferir composição sobre herança" e assim por diante. No entanto, hierarquias profundas de composição também parecem problemáticas.
Digamos que precisamos de uma coleção de relatórios detalhando os resultados de uma experiência:
class Model {
// ... interface
Array<Result> m_results;
}
Cada resultado tem certas propriedades. Isso inclui o tempo do experimento, bem como alguns metadados de cada estágio do experimento:
enum Stage {
Pre = 1,
Post
};
class Result {
// ... interface
Epoch m_epoch;
Map<Stage, ExperimentModules> m_modules;
}
OK ótimo. Agora, cada módulo do experimento possui uma sequência que descreve o resultado do experimento, bem como uma coleção de referências a conjuntos de amostras experimentais:
class ExperimentalModules {
// ... interface
String m_reportText;
Array<Sample> m_entities;
}
E então cada amostra tem ... bem, você entendeu.
O problema é que, se estou modelando objetos do meu domínio de aplicativo, isso parece um ajuste muito natural, mas no final do dia, a Result
é apenas um contêiner estúpido de dados! Não parece valioso criar um grande grupo de classes para ele.
Supondo que as estruturas e classes de dados mostradas acima modelem corretamente os relacionamentos no domínio do aplicativo, existe uma maneira melhor de modelar esse "resultado", sem recorrer a uma hierarquia profunda de composição? Existe algum contexto externo que o ajude a determinar se esse design é bom ou não?