Entschuldigung, wenn "Composition Hierarchy" keine Sache ist, aber ich werde erklären, was ich damit in der Frage meine.
Es gibt keinen OO-Programmierer, der nicht auf eine Variante von "Vererbungshierarchien flach halten" oder "Komposition der Vererbung vorziehen" usw. gestoßen ist. Tiefe Kompositionshierarchien scheinen jedoch ebenfalls problematisch zu sein.
Angenommen, wir benötigen eine Sammlung von Berichten, in denen die Ergebnisse eines Experiments aufgeführt sind:
class Model {
// ... interface
Array<Result> m_results;
}
Jedes Ergebnis hat bestimmte Eigenschaften. Dazu gehören der Zeitpunkt des Experiments sowie einige Metadaten aus jeder Phase des Experiments:
enum Stage {
Pre = 1,
Post
};
class Result {
// ... interface
Epoch m_epoch;
Map<Stage, ExperimentModules> m_modules;
}
Ok, großartig. Jetzt enthält jedes Experimentmodul eine Zeichenfolge, die das Ergebnis des Experiments beschreibt, sowie eine Sammlung von Verweisen auf experimentelle Probensätze:
class ExperimentalModules {
// ... interface
String m_reportText;
Array<Sample> m_entities;
}
Und dann hat jede Probe ... nun, Sie bekommen das Bild.
Das Problem ist, dass das Modellieren von Objekten aus meiner Anwendungsdomäne sehr natürlich erscheint, aber letztendlich Resultist a nur ein blöder Datencontainer! Es scheint nicht lohnenswert, eine große Gruppe von Klassen dafür zu erstellen.
Unter der Annahme, dass die oben gezeigten Datenstrukturen und Klassen die Beziehungen in der Anwendungsdomäne korrekt modellieren, gibt es eine bessere Möglichkeit, ein solches "Ergebnis" zu modellieren, ohne auf eine tiefe Kompositionshierarchie zurückzugreifen? Gibt es einen externen Kontext, anhand dessen Sie feststellen können, ob ein solches Design gut ist oder nicht?