Toutes mes excuses si "Composition Hiérarchie" n'est pas une chose, mais je vais expliquer ce que j'entends par là dans la question.
Il n'y a aucun programmeur OO qui ne soit tombé sur une variante de "Garder les hiérarchies d'héritage à plat" ou "Préférer la composition à l'héritage" et ainsi de suite. Cependant, les hiérarchies de composition profondes semblent également problématiques.
Disons que nous avons besoin d'une collection de rapports détaillant les résultats d'une expérience:
class Model {
// ... interface
Array<Result> m_results;
}
Chaque résultat a certaines propriétés. Ceux-ci incluent le temps de l'expérience, ainsi que certaines métadonnées de chaque étape de l'expérience:
enum Stage {
Pre = 1,
Post
};
class Result {
// ... interface
Epoch m_epoch;
Map<Stage, ExperimentModules> m_modules;
}
D'accord, super. Désormais, chaque module d'expérience possède une chaîne décrivant le résultat de l'expérience, ainsi qu'une collection de références à des ensembles d'échantillons expérimentaux:
class ExperimentalModules {
// ... interface
String m_reportText;
Array<Sample> m_entities;
}
Et puis chaque échantillon a ... eh bien, vous obtenez l'image.
Le problème est que si je modélise des objets de mon domaine d'application, cela semble être un ajustement très naturel, mais à la fin de la journée, a Result
est juste un conteneur stupide de données! Il ne semble pas utile de créer un grand groupe de classes pour cela.
En supposant que les structures de données et les classes illustrées ci-dessus modélisent correctement les relations dans le domaine d'application, existe-t-il une meilleure façon de modéliser un tel "résultat", sans recourir à une hiérarchie de composition approfondie? Existe-t-il un contexte externe qui pourrait vous aider à déterminer si une telle conception est bonne ou non?