Mi viene presentato un dilemma durante il tentativo di riprogettare la struttura della classe per la mia applicazione PHP / MySQL per renderla più elegante e conforme al principio SOLID.
Il problema è simile a questo:
Supponiamo che esista una classe astratta chiamata person
che ha determinate proprietà per definire una persona generica, come name
, age
, date of birth
ecc.
Ci sono due classi, student
e teacher
, che implementa questa classe astratta. Aggiungono le loro proprietà uniche ad esso.
Ho progettato tutte e tre le classi per includere tutte le logiche operative (i cui dettagli non sono rilevanti nel contesto della domanda).
Ora ho bisogno di creare viste / report / griglie di dati che contengano dettagli di più classi, per esempio, ad esempio, un elenco di tutti gli studenti che fanno progetti in Chimica guidati da un insegnante il cui nome è il parametro della query.
Questo è solo un esempio di una vista, ci sono molte viste differenti nell'applicazione, che usa dati da 3-4 tabelle, e ognuno di essi ha più parametri di input per generarli.
Considerando questo particolare esempio, ho scritto la query pertinente usando JOIN ei risultati sono come attesi e corretti, ora ecco il dilemma:
Tenendo presente il principio della responsabilità unica, dove dovrei mantenere questa domanda? Non appartiene alla classe Student
o alla classe Teacher
o a qualsiasi altra classe attualmente presente.
a) Devo creare una nuova classe, diciamo dataView
class, e progettarla come pattern MVC e mantenere la query lì? E le altre opinioni? come si adattano a questa architettura?
b) Non dovrei mantenere la query nel codice e renderla DB View?
c) Ho sbagliato completamente nell'approccio? Se sì, qual'è l'approccio giusto?
Le mie considerazioni sono le seguenti:
a) dovrebbe essere facile aggiungere in seguito nuove viste se il requisito arriva, senza dover copiare / incollare-modificare il codice
b) vorrebbe renderlo il più liberamente accoppiato possibile in modo che se si verificano cambiamenti di struttura db minori, non si rompono
Ho fatto ricerche su google sulla progettazione di report e sui generatori di report OOP, ma tutti i risultati sembrano concentrarsi sulla progettazione visiva del report piuttosto che sul recupero dei dati. Mi sono già occupato dell'aspetto visivo del rapporto utilizzando MVC con i modelli html.
Sono sicuro che questo è un problema molto fondamentale con la soluzione nota, ma in qualche modo non riesco a trovarlo (forse la ricerca con una parola chiave errata).
Modifica1: modificato il titolo per renderlo più pertinente
Modifica2: la risposta accettata mi ha fatto pensare nella giusta direzione e identificare i miei difetti di progettazione, che alla fine mi hanno portato a trovare questa domanda e la soluzione in Stack Overflow che mi ha dato la risposta dettagliata per chiarire la confusione.