Qual è la differenza tra il modello di progettazione MVC, MVP e MVVM in termini di codifica c #


202

Se cerchiamo su Google usando la frase "Qual è la differenza tra MVC, MVP e MVVM design pattern", allora potremmo ottenere alcuni URL che discutono la differenza tra MVC MVP e MVVM design pattern teoricamente come :

MVP

Utilizzare in situazioni in cui l'associazione tramite un datacontext non è possibile. Windows Forms ne è un perfetto esempio. Per separare la vista dal modello, è necessario un presentatore. Poiché la vista non può essere associata direttamente al relatore, le informazioni devono essere passate alla vista tramite un'interfaccia (IView).

MVVM

Utilizzare in situazioni in cui è possibile l'associazione tramite un datacontext. Perché? Le varie interfacce IView per ogni vista vengono rimosse, il che significa meno codice da mantenere. Alcuni esempi in cui MVVM è possibile includono progetti WPF e javascript tramite Knockout.

MVC

Utilizzare in situazioni in cui la connessione tra la vista e il resto del programma non è sempre disponibile (e non è possibile impiegare efficacemente MVVM o MVP). Questo descrive chiaramente la situazione in cui un'API Web è separata dai dati inviati ai browser client. ASP.NET MVC di Microsoft è un ottimo strumento per gestire tali situazioni e fornisce un framework MVC molto chiaro


Ma non ho trovato un singolo articolo che discute teoricamente della differenza insieme al codice di esempio.

Sarebbe davvero bello se ricevessi un articolo che discute la differenza tra questi 3 modelli di progettazione (MVC, MVP e MVVM) insieme al codice.

Vorrei mettere le mani sul codice sorgente di 3 app CRUD simili che sono state implementate da questi tre modelli di progettazione (MVC, MVP e MVVM). In modo che io possa esaminare il codice e capire come si dovrebbe scrivere il codice per questi tre schemi di progettazione (MVC, MVP e MVVM).

Quindi, se esiste un articolo del genere che discute come il codice apparirebbe diverso per questi 3 modelli di progettazione (MVC, MVP e MVVM), per favore reindirizzami a quell'articolo.


14
Nel TechEd 2011 è stata presentata una buona ma semplice presentazione di questi 3 modelli. Il relatore ha realizzato e mostrato esempi sullo stesso modello di business usando C # e Visual Studio. Ecco il video in channel9 MVC, MVP e MVVM: A Comparison of Architectural Patterns
Marco Medrano

2
Ecco l'articolo: realm.io/news/eric-maxwell-mvc-mvp-and-mvvm-on-android . IMO molto ben scritto e chiaro. Ha anche un repository Github con un ramo per ogni modello.
cuddlecheek,

Questo è stato interessante: cirw.in/blog/time-to-move-on
Andrew

Risposte:


100

Alcune differenze di base possono essere scritte in breve:

MVC:

MVC tradizionale è dove c'è un

  1. Modello: funge da modello per i dati
  2. Visualizza: offre all'utente la vista che può essere l'interfaccia utente
  3. Controller: controlla l'interazione tra Model e View, dove view chiama il controller per aggiornare il modello. View può chiamare più controller se necessario.

MVP:

Simile al tradizionale MVC ma Controller viene sostituito da Presenter. Ma il Presentatore, a differenza del Controller, è anche responsabile della modifica della vista. La vista di solito non chiama il relatore.

MVVM

La differenza qui è la presenza di View Model. È una specie di implementazione di Observer Design Pattern, in cui anche i cambiamenti nel modello sono rappresentati nella vista dalla VM. Ad esempio: se si modifica un dispositivo di scorrimento, viene aggiornato non solo il modello, ma anche i dati che possono essere un testo visualizzato nella vista. Quindi esiste un'associazione dati bidirezionale.


1
Piccoli dettagli: puoi scegliere se si tratta di un'associazione dati bidirezionale o puoi anche definire un'associazione unidirezionale.
Jviaches,

10
"La vista di solito non chiama il presentatore"? puoi spiegare di più su questa frase? se vedrai che non chiamerai il presentatore che sta per farlo?
Amir Ziarati,

3
@AmirZiarati Il presentatore tiene d'occhio gli eventi. In caso di eventi, il presentatore entra in gioco e intraprende le azioni necessarie.
Pritam Banerjee,

sì, purché abbia un riferimento da visualizzare. ho sbagliato, pensavo che intendevi che view non avrebbe nemmeno bisogno di chiamare un presentatore inizialmente mentre dovrebbe almeno una volta. grazie;)
Amir Ziarati il

1
@PritamBanerjee, Dalla spiegazione, sia MVP che MVVM hanno quasi la stessa funzionalità. P o VM aggiornano M e V.
Manohar Reddy Poreddy il

42

MVC, MVP, MVVM

MVC (vecchio)

MVP (più modulare a causa del suo accoppiamento basso. Presenter è un mediatore tra View e Model)

MVVM (Hai già un'associazione bidirezionale tra il componente VM e UI, quindi è più automatizzato di MVP) inserisci qui la descrizione dell'immagine

Un'altra immagine: inserisci qui la descrizione dell'immagine


24
Per favore, non solo copiare le immagini, specialmente quando non sono d'accordo tra loro. Vedi MVC (il vecchio che non vedi) parla del browser per vederlo nell'immagine in alto, ma parla al controller nell'immagine in basso.
peter.fr,

1
@UddhavGautam È un po 'confuso perché la prima immagine mostra View come punto di ingresso e la seconda mostra Controller.
everlasto,

1
Nel primo diagramma qual è la differenza tra MVVM e MVP? A mio avviso, sono solo i collegamenti tra la V e la VM / P. Che in un caso ha i messaggi avanti e indietro come collegamento bidirezionale e nell'altro sono rappresentati come due collegamenti unidirezionali. Non vedo alcuna differenza funzionale tra di loro. Cosa mi sto perdendo?
iCyberPaul,

1
Browser indica l'utente da cui avviene l'interazione tra l'utente e l'applicazione.
Uddhav Gautam,

4
Trama: nessuno in realtà sa cosa sta succedendo. In realtà sono tutti la stessa cosa. Haha. No, ma davvero, anche con queste immagini "utili" è difficile elaborare cosa diavolo sta succedendo. Penso che sia parte del problema / confusione.
Andrew,

34

Grande spiegazione dal link: http://geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx

Diamo un'occhiata a MVC

L'ingresso viene prima indirizzato al controller, non alla vista. Tale input potrebbe provenire da un utente che interagisce con una pagina, ma potrebbe anche essere semplicemente inserendo un URL specifico in un browser. In entrambi i casi, si tratta di un controller che viene interfacciato per dare il via ad alcune funzionalità.

Esiste una relazione molti-a-uno tra il controller e la vista. Questo perché un singolo controller può selezionare diverse viste da rendere in base all'operazione eseguita.

C'è una freccia a senso unico da Controller a View. Questo perché View non ha alcuna conoscenza o riferimento al controller.

Il controller restituisce il modello, quindi esiste una conoscenza tra la vista e il modello previsto che gli viene passato, ma non il controller che lo serve.

MVP - Model View Presenter

Ora diamo un'occhiata al modello MVP. Sembra molto simile a MVC, ad eccezione di alcune distinzioni chiave:

L'input inizia con la vista, non con il presentatore.

Esiste un mapping uno a uno tra la vista e il relatore associato.

La vista contiene un riferimento al presentatore. Il relatore sta inoltre reagendo agli eventi attivati ​​dalla vista, quindi è consapevole della vista a cui è associato.

Il relatore aggiorna la vista in base alle azioni richieste che esegue sul modello, ma la vista non è a conoscenza del modello.

MVVM - Modello Visualizza Modello vista

Quindi, con i pattern MVC e MVP di fronte a noi, diamo un'occhiata al pattern MVVM e vediamo quali differenze contiene:

L'input inizia con Visualizza, non Visualizza modello.

Mentre la vista contiene un riferimento al modello vista, il modello vista non ha informazioni sulla vista. Questo è il motivo per cui è possibile avere una mappatura uno-a-molti tra varie viste e un modello di vista ... anche attraverso le tecnologie. Ad esempio, una vista WPF e una vista Silverlight potrebbero condividere lo stesso modello vista.


7
"Questo perché View non ha alcuna conoscenza o riferimento al controller" Questo non è vero
Adam Wolski,

@AmirZiarati ViewModel non fa parte di MVP ma del modello MVVM.
Joe,

Sarei bravo se fornissi esempi come dove potremmo usare questi schemi
JKA

3

L'immagine sotto è dall'articolo scritto da Erwin van der Valk:

immagine che spiega MVC, MVP e MVVM - di Erwin Vandervalk

L' articolo spiega le differenze e fornisce alcuni esempi di codice in C #


Le immagini sopra non sono confuse, come in MVC perché VISUALIZZARE direttamente il Modello? lo stesso per gli altri?
smkrn110,

In questi diagrammi non è chiaro cosa significano le frecce. La freccia significa accesso o manipolazione? Nel diagramma MVC non è chiaro il motivo per cui non vi è alcuna freccia che inizia dal Modello
Pontios
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.