Ho un sistema di gestione e monitoraggio della formazione, con una struttura di alto livello come segue:
Abbiamo un ruolo 1 , ad es. Manager, Shift-boss, minatore, ecc. E un Candidato , formazione per quel ruolo. Il ruolo ha un elenco di corsi e le loro materie che il candidato deve completare per qualificarsi per il ruolo. Candidato ha un attributo TrainingHistory
, contenente i corsi e gli argomenti che hanno completato, i loro risultati e la data di completamento.
Ora lo vedo come un corso TrainingHistoryCourse is-a , esteso per aggiungere DateCompleted
ecc. ma qualcosa mi assilla usare piuttosto qualcosa come TrainingHistoryRecord che ha-un corso . Come posso analizzare ulteriormente questo per determinare quale pattern usare?
Quindi, un ruolo ha una lista di definizioni RoleTask che il Candidato deve essere osservato mentre pratica e un Candidato ha una storia di RoleTaskObservation oggetti che registrano le loro prestazioni in queste attività. Questo è molto simile al requisito del corso / soggetto e al modello cronologico per il candidato, ad eccezione di un livello gerarchico inferiore, ma, un RoleTaskObservation chiaramente non ha un is-a relazione con RoleTask , a meno che non blocchi il naso e preferisco usare ObservedRoleTask .
Preferirei usare lo stesso schema per le strutture soggetto / corso e compito / osservazione, ma penso che mi costringerebbe ad adottare un modello di composizione per TrainingHistoryCourse . Qual è la saggezza qui? Eredita sempre dove possibile e convalidato da un solido è-un'associazione, o preferisci sempre la composizione ovunque sia possibile?
1 Il client ha specificato che questo si chiama JobTitle, ma non sta scrivendo l'app e un JobTitle è solo un attributo di un ruolo. I ruoli di autorizzazione sono gestiti dal framework DevExpress e dai relativi hook di personalizzazione, quindi non ci sarebbe molto poco confusione tra un ruolo aziendale nei miei oggetti dominio e un ruolo di autorizzazione nel codice framework di livello inferiore.