Organizzazione della comunicazione delle entità MVC

3

Ho la seguente situazione. Immagina di avere un oggetto MainWindow che esegue il layout di due diversi widget, ListWidget e DisplayWidget. ListWidget viene popolato con i dati dal disco. DisplayWidget mostra i dettagli della selezione eseguita dall'utente nel ListWidget.

Ho intenzione di fare quanto segue: in MainWindow ho i seguenti oggetti:

  • ListWidget
  • ListView
  • ListModel
  • ListController

ListView è inizializzato passando il ListWidget. ListViewController viene inizializzato passando la vista e il modello.

Lo stesso accade per il DisplayWidget:

  • DisplayWidget
  • DisplayView
  • DisplayModel
  • DisplayController

Inizializzo DisplayView con il widget e inizializzo il modello con ListController. Lo faccio perché DisplayModel esegue il wrapping di ListController per ottenere le informazioni sulla selezione corrente e i dati da visualizzare in DisplayView.

Sono molto arrugginito con MVC, essendo fuori dalla programmazione dell'interfaccia utente da un po '. È questo il layout di interazione previsto per la comunicazione di diverse triplette MVC? In altre parole, MVC si concentra sull'interazione di tre oggetti. Come si inserisce questa interazione nel suo insieme in un più ampio contesto di comunicazione con altre entità simili, MVC o no?

    
posta Stefano Borini 16.02.2012 - 11:54
fonte

2 risposte

1

Inizierò fornendoti grandi risorse per la progettazione MVC. La prima è la Sessione WWDC 2010 116 Model-View-Controller per iPhone OS (in realtà solo iOS), è leggermente adattata alle classi iOS, ma offre anche molte informazioni generalmente utili. Devi registrarti per diventare uno sviluppatore Apple (gratuito) per accedervi. Il secondo è il corso di Stanford iOS disponibile pubblicamente, anch'esso sarà adattato a iOS, ma la sua classe di introduzione si è concentrata su MVC in senso generale.

Ok, quindi quello che ottieni da quelle risorse sono regole come Viste che non possiedono i dati che visualizzano.

Direttamente dal corso di Stanford:

Model: What your application is (but not how it's displayed)
Controller: How your model is presented to the user (UI Logic)
View: Your controller's minions

Comunicazione

Controller: comunicazione diretta a modelli e viste.
Visualizzazioni: comunicazione "cieca" ai controllori (azioni-obiettivo e delega). Nessuna comunicazione ai modelli.
Modelli: trasmissione delle comunicazioni ai controllori (notifica e KVO). Nessuna comunicazione alle visualizzazioni.

Organizzazione

Per il tuo caso specifico, non sono sicuro di capire cosa stai descrivendo al 100%, non sono sicuro di quali siano questi "widget" (almeno per Android, un widget è un pacchetto di MVC che fornisce alcune funzionalità come un widget della barra di ricerca). Ma se vuoi dire che ListModel è qualcosa come un titolo e un indice implicito, e il DisplayModel è una descrizione corrispondente per l'indice dato, allora potrei avere un MainController (per la vista principale che contiene queste due sottoview o frammenti). L'utente seleziona una voce in ListView attivando una sorta di funzione onSelection sul MainController (ora il MainController sa quale elemento hanno selezionato). Il MainController lo passa accanto al DisplayController (ora il DisplayController sa quale oggetto hanno selezionato). Infine, DisplayController può utilizzare il DisplayModel per trovare ciò che deve essere visualizzato ora e quindi comunicare a DisplayView di visualizzarlo.

In alternativa, DisplayController può rispondere direttamente alla funzione onSelection attivata dalla selezione in ListController, ma collega componenti che probabilmente non dovrebbero essere collegati. Poiché hai detto che erano le loro Views che significa che sarebbe possibile avere un set up (possibilmente per schermi più piccoli) con ListView a schermo intero, viene fatta una selezione, quindi DisplayView riprende lo schermo mostrando la descrizione di la selezione fatta. Per questo motivo lascerei le viste separate.

Modifica

Quindi, iniziamo dicendo che MVC è solo una guida per produrre codice ben strutturato, per quanto ne so non è strettamente applicato. Successivamente, per il "non canonico" si riferisce a ciò che ciascun componente è supposto fare.

Essenzialmente, tutto ciò che non è scritto per mostrare qualcosa o interagire con lo schermo fa parte di un modello. I modelli sono gli algoritmi che eseguono i compiti. Le viste servono solo a far emergere un'interfaccia utente e forniscono modi per il programma di interagire con l'interfaccia utente (come nelle connessioni e nella delega dell'azione di destinazione). Ciò lascia i Controller a essere i delegati e gli obiettivi per le Visualizzazioni. Pensa al tipo di ingranaggi sotto le vedute che immagino. Dovrebbero essere il collegamento tra azioni sullo schermo e funzioni e dati nel modello. Dovrebbero assicurarsi che le visualizzazioni visualizzino il contenuto che si desidera visualizzare.

Ecco le foto tratte dal corso di Stanford (la prima classe) che mostrano come e come non impostare più MVC. (sfortunatamente posso pubblicare un massimo di 2 hyperlink e nessuna immagine)

MVC eseguito correttamente

MVC fatto in modo non corretto

    
risposta data 18.02.2012 - 18:54
fonte
0

HMVC potrebbe essere cosa stai cercando. È particolarmente utile quando si tratta di widgetry poiché incoraggia la decomposizione dal lato del cliente (cioè vista).

    
risposta data 21.03.2012 - 07:46
fonte

Leggi altre domande sui tag