2013-03-16 1 views
7

Ho fatto app iOS da quando mi ricordo, ma non ho maturato molto il mio stile di programmazione fino a poco tempo fa, quando ho avuto una programmazione di stage. Ho imparato molti concetti di OO in anticipo perché mi sono reso conto che la vita ha risucchiato senza comprenderli, ma una cosa che non ho mai imparato a conoscere era il pattern MVC.Cosa dovrebbe possedere il modello in un pattern MVC?

Per dare un contesto, diciamo che sto disegnando un sistema solare all'interno di un singolo SolarSystemView (una sottoclasse di UIView). Il mio SolarSystemView deve avere una variabile di istanza della classe SolarSystem (una classe contenente una struttura dati con tutte le importanti proprietà planetarie e stelari) o dovrebbe essere di proprietà di un'istanza di SolarSystemViewController? O è qualcosa di completamente diverso? Non riesco a trovare alcun codice di esempio che dia una risposta soddisfacente.

Immagino che se la vista possedesse il modello, le operazioni sarebbero molto fluide, ma anche questo non sembra un buon stile. Dopotutto, l'istanza SolarSystem deve cambiare dinamicamente in qualche modo e con la stessa velocità o lo stesso che gli aggiornamenti SolarSystemView.

risposta

5

Nel paradigma MVC, il modello deve essere separato dalla vista. Per ottenere i dati di cui ha bisogno per disegnare da sé, chiede il Controller per questo, che a sua volta chiede al Modello di farlo. In questo modo, disaccoppiamo le informazioni dalla GUI. Pensala come Model Controller View se ti aiuta. Pertanto, nella maggior parte dei casi, il controllore "possiede" il modello.

Ad esempio, in cs193p, il CalculatorViewController (Controller) ha una proprietà CalculatorBrain (Modello), con cui interagisce per visualizzare i risultati delle equazioni nella Vista.

Nel vostro esempio particolare, la SolarSystemViewController sarebbe probabilmente hanno un forte riferimento alla SolarSystem, quale sarebbe il polling per i dati che avrebbe mano dal l'SolarSystemView in modo che potesse disegnare se stesso quando aveva bisogno di un aggiornamento. Il SolarSystemView potrebbe anche notificare allo SolarSystemViewController quando l'utente interagisce con esso in modo che possa visualizzare altre visualizzazioni o aggiornare SolarSystem, tra le altre attività che potrebbe eseguire.

Si noti che il paradigma MVC in Cocoa e Cocoa Touch è un po 'diverso rispetto alla versione più generalizzata di MVC, come Smalltalk. Ad esempio, se osservi lo Wikipedia page on MVC, il diagramma dovrebbe apparire diverso da quello che hai imparato. In effetti, GoF (Design Patterns) descrive così MVC.

MVC è costituito da tre tipi di oggetti. Il Modello è l'oggetto dell'applicazione , la Vista è la sua presentazione sullo schermo e il Controller definisce il modo in cui l'interfaccia utente reagisce all'input dell'utente. Prima di MVC, i progetti di interfaccia utente tendevano a raggruppare questi oggetti. MVC li disaccoppia per aumentare la flessibilità e il riutilizzo. MVC disaccoppia le viste e i modelli stabilendo un protocollo di sottoscrizione/notifica tra di loro. Una vista deve garantire che il suo aspetto rifletta lo stato del modello. Ogni volta che i dati del modello cambiano, il modello notifica le viste che dipendono da . In risposta, ogni vista ha l'opportunità di aggiornare lo stesso . Questo approccio consente di allegare più viste a un modello su e fornire presentazioni diverse. È anche possibile creare nuove viste per un modello senza riscriverlo.

In entrambi questi casi, il Modello stesso sta contattando la Vista per aggiornarlo. Tuttavia, su iOS, l'interazione tra il modello e la vista viene gestita tramite il controller. Questo è ben spiegato nel first session of cs193p così come Apple's own documentation on MVC relationships. In questo modo, avete solo bisogno di riscrivere il codice di controllo di riutilizzare i modelli e le Visualizzazioni altrove.

Ecco lo schema MVC da cs193p per chiarire.

Model View Controller

+0

che copre completamente quello che ho chiesto; Ho un'ulteriore richiesta. Cosa dovrebbe fare il "tick" -ing? Dovrebbe ovviamente esserci un segno di spunta affinché i pianeti continuino a muoversi. Se ho capito bene, sarebbe il controllore che sarebbe proprio un timer, a quel punto avrebbe chiamato per il modello da modificare, quindi il recupero dei dati dal modello e la visualizzazione sullo schermo, giusto? Questo potrebbe essere contenuto per una domanda separata. –

+0

@CarterPape Sì, che suona giusto per me. Il Controller di solito gestisce gli aggiornamenti del Modello e quindi notifica le Viste che si basano su di esso per l'aggiornamento. Ad esempio, nel controllore esisterebbe il ciclo di esecuzione di un gioco e ogni frame che notificherebbe agli agenti nel gioco (il modello) di aggiornarsi, prima di notificare la vista (ad esempio un GLKView) per aggiornarsi. – Metabble

0

In questo caso, SolarSystemView non devono contenere ogni istante della classe Solarsystem. Il SolarSystemViewController dovrebbe essere il go tra la vista (SolarSystemView) e il modello (Solarsystem).