Mi scuso se "Gerarchia della composizione" non è una cosa, ma spiegherò cosa intendo con questo nella domanda.
Non c'è nessun programmatore OO che non abbia mai incontrato una variante di "Mantieni gerarchie ereditarie" o "Preferisci composizione su eredità" e così via. Tuttavia, anche le gerarchie di composizione profonda sembrano problematiche.
Supponiamo di aver bisogno di una raccolta di rapporti che descrivano in dettaglio i risultati di un esperimento:
class Model {
// ... interface
Array<Result> m_results;
}
Ogni risultato ha determinate proprietà. Questi includono il tempo dell'esperimento, nonché alcuni metadati di ciascuna fase dell'esperimento:
enum Stage {
Pre = 1,
Post
};
class Result {
// ... interface
Epoch m_epoch;
Map<Stage, ExperimentModules> m_modules;
}
Ok fantastico. Ora, ogni modulo dell'esperimento ha una stringa che descrive il risultato dell'esperimento, nonché una raccolta di riferimenti a set di campioni sperimentali:
class ExperimentalModules {
// ... interface
String m_reportText;
Array<Sample> m_entities;
}
E poi ogni campione ha ... beh, ottieni l'immagine.
Il problema è che se sto modellando oggetti dal mio dominio di applicazione, questo sembra un adattamento molto naturale, ma alla fine, a Result
è solo un muto contenitore di dati! Non sembra utile creare un folto gruppo di classi per questo.
Supponendo che le strutture e le classi di dati mostrate sopra modellino correttamente le relazioni nel dominio dell'applicazione, esiste un modo migliore per modellare un tale "risultato", senza ricorrere a una gerarchia di composizione profonda? Esiste un contesto esterno che possa aiutarti a determinare se un tale progetto è valido o no?