Non sono nemmeno sicuro di come chiedere questo, ma qui va:
Diciamo che ho un'applicazione Web che incorpora Insegnanti, Corsi e Studenti in modo tale da poter fare cose come questa (pseudocodice):
teacherQuery = new TeacherQuery;
teacher = teacherQuery.getById(teacherId); // teacher is a Teacher object
foreach (course in teacher.getCourses()) {
course.printName();
foreach (student in course.getStudents()) {
student.printName();
}
}
studentQuery = new StudentQuery;
students = studentQuery.getAllForCourse(courseId); // students is a
collection of Student objects
foreach (student in students) {
foreach (teacher in student.getTeachers()) {
// getTeachers() returns of a Collection of unique Teachers for all the
// Courses for the Student.
teacher.printName();
}
}
Ci sono molti modi per gestirlo, ma la mia domanda riguarda il cambiamento.
Diciamo che una volta che l'applicazione Insegnante / Corso / Studente funziona, il il cliente dice che vuole lasciare che gli studenti formino gruppi di studio, così che ogni studente può avere più gruppi di studio, e ciascun gruppo di studio può avere più studenti, ma ciascuno StudyGroup appartiene a un solo corso.
Lo sto masticando, e mi sembra di aggiungere inevitabilmente StudyGroups (o l'equivalente) significa apportare modifiche a un intero gruppo di classi. Oltre alla creazione StudyGroup e StudyGroupQuery, dovrai aggiungere getStudyGroups () a Studente e Corso e forse anche Maestro, e dovrai aggiungere getAllForStudyGroup () su StudentQuery e forse altre cose.
E, più precisamente, ogni volta che aggiungi un nuovo tavolo, dovrai farlo aggiungi nuovi metodi a ogni classe che ha una relazione con quella tabella.
Un approccio sarebbe quello di parametrizzarlo, in modo che invece di teacher.getStudyGroups () hai:
genericQuery.get('StudyGroups').by('Teacher').with('id',teacher.getId()).through('Courses').unique()
... o qualcosa del genere, ma non vorrai copiarlo e incollarlo ogni posto dove devi elencare i gruppi di studio supervisionati da un determinato insegnante (sei tu?) questo significa che vorresti creare getStudyGroupsByTeacher () da qualche parte, il che significa che dovrai modificare quel "luogo" quando è ora di farlo aggiungi getTextbooksByTeacher ().
Sono tentato di concludere che a volte ci sono cambiamenti che dicono solo l'Open / Closed principio di andare all'inferno, e questo è tutto quello che c'è da fare. Mi manca qualcosa?
(Una coppia di note obbligatorie: il codice sopra riportato è solo un esempio e io non sono letteralmente cercare un modo per incorporare gruppi di studio in un'applicazione di corso esistente. io Sono interessato a conoscere l'architettura, ma nel contesto di "Quale architettura il migliore consente di incorporare nuovi tipi di entità / tabelle? "non" Qual è il migliore architettura per un'applicazione Web? ")