Design pattern per gestire le query utilizzando più modelli

5

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.

    
posta coderkane 07.11.2013 - 05:56
fonte

2 risposte

2

Il tuo titolo non sembra macchiare la tua domanda e la tua domanda ha poco a che fare con la segnalazione, quindi potrebbe spiegare perché non hai trovato molto.

Il tuo problema inizia a emergere qui:

I have designed all the three classes to include all the operational logic (details of which are not relevant in context of the question).

Non penso che dovresti mettere "logica operativa" (intendi le operazioni di accesso ai dati come ottenere, aggiornare ed eliminare?) nelle classi del tuo modello.

for example, say, a list of all students doing projects in Chemistry mentored by a teacher whose name is the parameter to the query.

Per me, sembra che tu stia cercando il schema del repository . Qualcosa come:

class StudentRepository
{
    private $_database;

    function GetStudentByID($id)
    {
        return $_database..[query with $id];
    }

    function GetStudentsForSubjectAndTeacher($subjectID, $teacherID)
    {
        return $_database..[query with $subjectID, $teacherID];
    }
}

Ora ovunque desideri trovare tutti gli studenti per un determinato argomento e insegnante, devi solo creare un'istanza di questo repository e chiamare il metodo appropriato.

    
risposta data 07.11.2013 - 09:21
fonte
0

Bene, se capisco la query, il tuo dilemma è dove mettere questa query e non se la query deve essere inserita in una classe del modello considerando che stai seguendo lo schema MVC.

La mia opinione: Se vedi la query, alla fine stai recuperando gli studenti. Il recupero degli studenti può essere basato su progetti, maschi, femmine, classi, età, insegnanti ecc.

Sento che il modello dovrebbe essere student_model.php che ha vari metodi, dove nella tua query andrebbe

ad esempio: fetchMaleStudents (), fetchFemaleStudents (), fetchStudentsForProjects (projectName), fetchStudentsstrongacher (teacherName) e così via.

    
risposta data 07.11.2013 - 06:31
fonte

Leggi altre domande sui tag