disaccoppiamento dei componenti
In MVC, si ha un rapporto triangolare tra i componenti. Cioè: il controllore possiede la vista e il modello. La vista si basa sulla definizione del modello. Il modello deve soddisfare i requisiti della vista.Pensa a un hub (controller) e all'architettura dei raggi (vista e modello)
In MVVM, pensa a quel triangolo che si appiattisce con ciascun componente conoscendo solo un altro nella catena. Cioè: Visualizza-> ViewModel-> Modello
Il modello non è a conoscenza di tutto lo stack. ViewModel è a conoscenza solo del modello La vista è a conoscenza solo del modello di vista: non è a conoscenza del modello.
Perché è importante?
Questo è il nucleo della domanda originale.
Lo scopo principale è un'ulteriore astrazione della tua architettura. Questo in genere porterà a un po 'più di codice, ma meno punti di contatto tra gli oggetti. Meno punti di contatto sono importanti perché questo porta a un codice più agile. Maggiore è il grado di accoppiamento/contatto della Classe A con la Classe B, maggiore sarà l'impatto di un cambiamento nella Classe A. Ridurre l'impatto del cambiamento è uno dei vantaggi chiave di una buona architettura.
Per comprendere appieno ciò, è utile riflettere su cosa rappresentano realmente i componenti. Che cos'è una vista, un controller, un ViewModel o un modello? Sono definizioni letterali o più di un concetto astratto?
Nella mia esperienza, è stato più vantaggioso per prendere in considerazione il modello da un gruppo di classi/oggetti che si occupano della costruzione e la persistenza dei dati. Non è solo un semplice oggetto vecchio con proprietà. È una classe che esegue il recupero dei dati, salva i dati, una fabbrica che costruisce oggetti semplici e vecchi. È un livello facciata che fornisce un'API chiara nei dati. Questo strato di facciata dovrebbe essere referenziato direttamente dalla vista?
A mio parere, non dovrebbe. In MVC, questa risposta è anche "no". Il controller recupera i dati dal modello. A tale riguardo, MVC e MVVM raggiungono lo stesso obiettivo. Dove le due architetture differiscono è come i dati e la vista sono collegati.
come il modello, la vista può essere un insieme di classi che in coordinamento con l'un l'altro, il rendering di una vista di presentazione. Ciò potrebbe consistere in un View Controller + View nel caso di piattaforme mobili (View Controller su iOS, Attività su Android). In molti casi, è necessario un corso per caricare un documento di visualizzazione in memoria e aggiornare le proprietà di visualizzazione. C'è molto lavoro da fare qui. In MVC, il controller diventa rapidamente una classe 'kitchen sink' - una sorta di discarica per qualsiasi cosa relativa al contesto utente corrente.
Quando si moltiplica questa dozzina di potenziali visualizzazioni all'interno dell'applicazione, si ottengono molte dipendenze tra il codice del modello back-end e il codice View front-end. Con le classi di controller di grandi dimensioni, queste dipendenze non sono immediatamente evidenti.
appiattimento le dipendenze
MVVM appiattisce le dipendenze. Questo crea attenzione. Cos'è l'attenzione? La capacità di lavorare su un singolo pezzo di funzionalità senza la distrazione di tutte le altre dipendenze. Ora puoi iniziare a scrivere test di unità su codice che in precedenza era ritenuto non testabile.
Il modello di vista funge da facciata tra la vista e il modello. Il modello di vista soddisfa le esigenze della vista: tecnicamente la vista dovrebbe possedere il modello di vista. Se la Vista richiede dati da più fonti, il Modello di vista incapsula la composizione di origini dati separate in un singolo oggetto unificato, de-normalizzato.Se la vista deve essere richiamata nel modello o in altre destinazioni, il modello di vista fornisce hook e instrada la chiamata appropriata.
Considerare come funziona una patch panel di rete. A prima vista, questo sembra ridondante - perché non collegare semplicemente la tua ethernet dal punto A al punto B. Ma con l'esperienza, capirai che un pannello di permutazione ti fornisce un pezzo chiave di astrazione che ti consente di modificare i percorsi di Point B senza influenzare il punto A. Questo è ciò che sta facendo il tuo View Model.
Ora che si dispone di un'astrazione pulita tra la vista e il modello, è necessario che la vista/il controller riguardi solo la presentazione. Ciò significa che non deve occuparsi di localizzazione o formattazione, ma riceve dati e presenta dati. Your View Model è il luogo ideale per mettere questo tipo di pre-visualizzazione dei dati di massaggio. Diciamo che è necessario filtrare i dati in base a un criterio. Ancora una volta, il modello di visualizzazione è ben informato sui dati del modello (la tua vista non lo è) ed è un ottimo posto dove inserire questo tipo di codice.
Dopo aver iniziato ad organizzare i requisiti dell'applicazione in questo modo, il codice Visualizza/Controller diventa più pulito e quando qualcosa deve essere modificato, le implicazioni sono più evidenti, il che porta a un numero inferiore di bug.
Testabilità
Una nota finale sulla verificabilità: Con appiattimento dipendenze, che rende più facile iniettare le dipendenze finte nelle vostre prove. Rende i test più facili e concisi. Il tuo modello di vista diventa qualcosa per cui puoi definire casi di test chiari.
Questo potrebbe aiutare: http://stackoverflow.com/questions/667781/what-is-the-difference-between-mvc-and-mvvm – SeanJA