2011-06-17 9 views
5

questa la mia prima domanda qui. Spero che qualcuno possa aiutarti.
Si tratta di buone pratiche di progettazione orientate agli oggetti.
Sto scrivendo un'app per Android, ma la domanda è generale e si applicherebbe in modo uguale a (ad es.) Un'interfaccia utente mobile.
Per amor di discussione, dire che ho uno studente di classe.Gli oggetti dovrebbero disegnarsi da soli? Come? (Sto usando Android tuttavia la domanda si applica a tutte le lingue OO)

public class Student { 
    public int StudentID; 
    public String firstName; 
    public String lastName; 
} 

c'è un principio che si dovrebbe raramente chiedere un oggetto per informazioni su se stesso, piuttosto si dovrebbe indicare cosa si vuole fare, e lasciare che l'oggetto fare il lavoro in sé. A tal fine, ho i seguenti metodi

public class Student { 
    public int StudentID; 
    public String firstName; 
    public String lastName; 

    // Constructors 
    public Student() {} 

    public Student (int StudentID){ 
     populateFromDataBase (StudentID); 
    } 

    private void populateFromDataBase (int StudentID){ 
     // Get the data from the database and set the 
     // values of all the properties of this 
    } 

    public void save(){ 
     // Save the values of the properties to db 
    } 

} 

Questo è il modo che altre classi possono utilizzare questa classe senza preoccuparsi di come persiste sue informazioni.
Declinazioni di responsabilità: So che non sto usando gli accessor, solo proprietà pubbliche. Sto solo cercando di mantenere questo esempio semplice.
Non chiedere come una classe esterna potrebbe conoscere uno StudentID, Questo è irrelavent alla domanda che voglio porre, che è questo:

(Dire) Voglio disegnare una tabella di studenti e i loro dettagli sullo schermo. Dalla classe UI (Say a ListActivity in Android) potrei ottenere una serie di studenti, quindi collegarli tra loro, impostando le proprietà del mio ListView mentre procedo. Il problema che ho con questo è che mi sembra di pensare troppo proceduralmente, e non nel vero spirito del design orientato agli oggetti. Richiede anche che ogni oggetto studente venga interrogato su se stesso, violando l'incapsulamento.
Apparentemente (da quello che ho letto) lo studente dovrebbe disegnare se stesso.
Ecco dove mi confondo. Come può uno studente disegnarsi da solo quando non sa nulla dell'interfaccia utente? Devo passare un riferimento all'interfaccia utente all'oggetto studente? Questo rompe la separazione tra presentazione e livelli aziendali o no? Che cosa è considerata una buona pratica? Ci sono articoli o schemi di progettazione là fuori, preferibilmente con codice di esempio, perché non sono riuscito a trovarne? Sono preoccupato per qualcosa non così importante e dovrei semplicemente andare con la mia prima idea disordinata?
Apprezzo davvero qualsiasi input, poiché chiaramente questo è un problema che si ripresenterà con qualsiasi cosa io codifichi.

Un'altra possibilità che ho preso in considerazione era l'accesso al database direttamente dall'interfaccia utente e il collegamento a un cursore, ma questo sembra solo sbagliato. o è?

+0

[Model View ViewModel] (http://en.wikipedia.org/wiki/Model_View_ViewModel) è una buona cosa da leggere.I concetti (credo) coinvolgono le visualizzazioni che si aggiornano automaticamente quando i dati sottostanti (il modello) cambiano. Quindi fondamentalmente diviso in un 'StudentView' e' StudentModel' – Raynos

risposta

3

Le opinioni possono variare, ma IMHO, gli oggetti non devono disegnare se stessi o per questo motivo, salvarsi nel database.

Per il disegno, in genere implementerei una qualche forma di doppia spedizione, ad esempio Visitor Pattern.

Per la separazione dall'interfaccia utente, è necessario considerare anche Model-View-Controller, Model-View-Presenter o Model-View-ViewModel.

La persistenza degli oggetti può essere un po 'più complessa, e potrebbe coinvolgere modelli assortiti, come descritto in Patterns of Enterprise Application Architecture di Martin Fowler e riepilogato nel sito Web di Fowler catalog.

E, naturalmente, l'interfaccia utente non deve ignorare il modello e andare direttamente al database.

+0

Grazie. Mi hai dato molto a cui pensare. È tempo di colpire i libri (siti web). – Dan

Problemi correlati