Disculpas si "Jerarquía de composición" no es una cosa, pero explicaré a qué me refiero en la pregunta.
No hay ningún programador de OO que no haya encontrado una variación de "Mantener jerarquías de herencia planas" o "Preferir composición sobre herencia", etc. Sin embargo, las jerarquías de composición profunda también parecen problemáticas.
Digamos que necesitamos una colección de informes que detallen los resultados de un experimento:
class Model {
// ... interface
Array<Result> m_results;
}
Cada resultado tiene ciertas propiedades. Estos incluyen el tiempo del experimento, así como algunos metadatos de cada etapa del experimento:
enum Stage {
Pre = 1,
Post
};
class Result {
// ... interface
Epoch m_epoch;
Map<Stage, ExperimentModules> m_modules;
}
Vale genial. Ahora, cada módulo de experimento tiene una cadena que describe el resultado del experimento, así como una colección de referencias a conjuntos de muestras experimentales:
class ExperimentalModules {
// ... interface
String m_reportText;
Array<Sample> m_entities;
}
Y luego cada muestra tiene ... bueno, te haces una idea.
El problema es que si estoy modelando objetos del dominio de mi aplicación, esto parece un ajuste muy natural, pero al final del día, un Result
es un simple contenedor de datos! No parece que valga la pena crear un gran grupo de clases para ello.
Suponiendo que las estructuras de datos y las clases que se muestran arriba modelan correctamente las relaciones en el dominio de la aplicación, ¿hay una mejor manera de modelar tal "resultado", sin recurrir a una jerarquía de composición profunda? ¿Existe algún contexto externo que lo ayude a determinar si ese diseño es bueno o no?
fuente