Jaka jest różnica między wzorcem projektowym MVC, MVP i MVVM pod względem kodowania c #

202

Jeśli przeszukamy Google za pomocą wyrażenia „Jaka jest różnica między wzorcem projektowym MVC, MVP i MVVM”, możemy uzyskać kilka adresów URL omawiających różnicę między wzorcem projektowym MVC MVP i MVVM teoretycznie :

MVP

Użyj w sytuacjach, w których powiązanie za pomocą tekstu danych nie jest możliwe. Windows Forms jest tego doskonałym przykładem. Aby oddzielić widok od modelu, potrzebny jest prezenter. Ponieważ widok nie może być bezpośrednio powiązany z prezenterem, informacje muszą zostać przekazane do widoku przez interfejs (IView).

MVVM

Użyj w sytuacjach, w których możliwe jest wiązanie za pomocą tekstu danych. Czemu? Różne interfejsy IView dla każdego widoku są usuwane, co oznacza mniej kodu do utrzymania. Niektóre przykłady, w których możliwy jest MVVM, obejmują projekty WPF i JavaScript w Knockout.

MVC

Używaj w sytuacjach, gdy połączenie między widokiem a resztą programu nie zawsze jest dostępne (i nie możesz skutecznie zastosować MVVM lub MVP). To wyraźnie opisuje sytuację, w której interfejs API sieci Web jest oddzielony od danych wysyłanych do przeglądarek klienta. Microsoft ASP.NET MVC firmy Microsoft jest doskonałym narzędziem do zarządzania takimi sytuacjami i zapewnia bardzo przejrzystą strukturę MVC


Ale nie znalazłem ani jednego artykułu, który teoretycznie omawia różnicę wraz z przykładowym kodem.

Byłoby naprawdę miło, gdybym dostał artykuł omawiający różnicę między tymi 3 wzorami projektowymi (MVC, MVP i MVVM) wraz z kodem.

Chciałbym zdobyć kod 3 podobnych aplikacji CRUD, które zostały zaimplementowane przez te trzy wzorce projektowe (MVC, MVP i MVVM). Żebym mógł przejść przez kod i zrozumieć, jak należy napisać kod dla tych trzech wzorców projektowych (MVC, MVP i MVVM).

Więc jeśli istnieje taki artykuł, który omawia, jak kod wyglądałby inaczej dla tych 3 wzorców projektowych (MVC, MVP i MVVM), to proszę przekieruj mnie do tego artykułu.

Tomasz
źródło
14
W TechEd 2011 była dobra, ale prosta prezentacja na temat tych 3 wzorców. Prelegent wykonał i pokazał przykłady w tym samym modelu biznesowym przy użyciu C # i Visual Studio. Oto wideo z kanału 9 MVC, MVP i MVVM: Porównanie wzorów architektonicznych
Marco Medrano
2
Oto artykuł: realm.io/news/eric-maxwell-mvc-mvp-and-mvvm-on-android . Bardzo dobrze napisane i jasne IMO. Ma również repozytorium Github z odgałęzieniem dla każdego wzoru.
cuddlecheek
To było interesujące: cirw.in/blog/time-to-move-on
Andrew

Odpowiedzi:

100

Kilka podstawowych różnic można napisać w skrócie:

MVC:

Tam gdzie jest tradycyjny MVC

  1. Model: Działa jako model danych
  2. Widok: dotyczy widoku dla użytkownika, którym może być interfejs użytkownika
  3. Kontroler: Kontroluje interakcję między modelem a widokiem, gdzie widok wywołuje kontroler w celu aktualizacji modelu. W razie potrzeby widok może wywoływać wiele kontrolerów.

MVP:

Podobne do tradycyjnego MVC, ale kontroler został zastąpiony przez prezentera. Ale Prezenter, w przeciwieństwie do Kontrolera, jest również odpowiedzialny za zmianę widoku. Widok zwykle nie wywołuje prezentera.

MVVM

Różnica polega tutaj na obecności View Model. Jest to rodzaj implementacji wzorca projektowania obserwatora, w którym zmiany w modelu są również reprezentowane w widoku przez maszynę wirtualną. Np .: W przypadku zmiany suwaka aktualizowany jest nie tylko model, ale również dane, które mogą być tekstem wyświetlanym w widoku. Istnieje więc dwukierunkowe wiązanie danych.

Pritam Banerjee
źródło
1
Mały szczegół - możesz wybrać, czy jest to dwukierunkowe wiązanie danych, czy możesz również zdefiniować wiązanie jednokierunkowe.
Jviaches
10
„Widok zazwyczaj nie wywołuje prezentera”? czy możesz wyjaśnić więcej o tym zdaniu? jeśli widok interfejsu użytkownika nie zadzwoni do prezentera, który zamierza?
Amir Ziarati,
3
@AmirZiarati Prezenter obserwuje wydarzenia. W przypadku wydarzeń prezenter wchodzi do gry i podejmuje niezbędne działania.
Pritam Banerjee
tak, o ile ma odniesienie do wyświetlenia. pomyliłem się, myślałem, że masz na myśli, że widok nie musi nawet początkowo dzwonić do prezentera, chociaż powinien przynajmniej raz. dzięki;)
Amir Ziarati,
1
@PritamBanerjee, Z wyjaśnienia, zarówno MVP, jak i MVVM mają prawie taką samą funkcjonalność. P lub VM aktualizują oba M i V.
Manohar Reddy Poreddy
42

MVC, MVP, MVVM

MVC (stary)

MVP (bardziej modułowy ze względu na niskie sprzężenie. Prezenter jest pośrednikiem między View a Model)

MVVM (Masz już dwukierunkowe wiązanie między VM a komponentem interfejsu użytkownika, więc jest bardziej zautomatyzowane niż MVP) wprowadź opis zdjęcia tutaj

Kolejny obraz: wprowadź opis zdjęcia tutaj

Uddhav Gautam
źródło
24
Nie kopiuj tylko zdjęć - zwłaszcza gdy nie zgadzają się między sobą. Zobacz MVC (stara, której nie widzisz) przeglądarka mówi, aby wyświetlić na górnym obrazku, ale komunikuje się z kontrolerem na dolnym obrazie.
peter.fr
1
@UddhavGautam To trochę mylące, ponieważ pierwsze zdjęcie pokazuje Widok jako punkt wejścia, a drugie pokazuje Kontroler.
everlasto,
1
Na pierwszym schemacie jaka jest różnica między MVVM a MVP? Widzę, że to tylko powiązania między V a VM / P. Które w jednym przypadku zawierają komunikaty do przodu i do tyłu jako łącze dwukierunkowe, w drugim są reprezentowane jako dwa łącza jednokierunkowe. Nie widzę między nimi żadnej funkcjonalnej różnicy. czego mi brakuje?
iCyberPaul
1
Przeglądarka oznacza użytkownika, z którego odbywa się interakcja między tobą a aplikacją.
Uddhav Gautam
4
Skręt fabuły: nikt tak naprawdę nie wie, co się dzieje. Wszystkie są właściwie tym samym. Ha ha. Nie, ale naprawdę, nawet przy tych „pomocnych” obrazach trudno jest zrozumieć, co się do cholery dzieje. Myślę, że to część problemu / zamieszania.
Andrew
34

Świetne wyjaśnienie z linku: http://geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx

Spójrzmy najpierw na MVC

Wejście jest najpierw kierowane do kontrolera, a nie do widoku. Dane wejściowe mogą pochodzić od użytkownika wchodzącego w interakcję ze stroną, ale mogą też pochodzić z wpisania określonego adresu URL w przeglądarce. W obu przypadkach jest to kontroler, który jest połączony z niektórymi funkcjami.

Istnieje relacja typu jeden do jednego między kontrolerem a widokiem. Jest tak, ponieważ pojedynczy kontroler może wybrać różne widoki do renderowania w zależności od wykonywanej operacji.

Istnieje jedna strzałka w jedną stronę od kontrolera do widoku. Wynika to z faktu, że widok nie ma żadnej wiedzy ani odniesienia do kontrolera.

Kontroler przekazuje model z powrotem, więc istnieje wiedza między widokiem a oczekiwanym modelem przekazywanym do niego, ale nie kontroler go obsługuje.

MVP - Model View Presenter

Teraz spójrzmy na wzór MVP. Wygląda bardzo podobnie do MVC, z wyjątkiem kilku kluczowych różnic:

Wejście zaczyna się od Widoku, a nie Prezentera.

Pomiędzy widokiem i powiązanym prezenterem istnieje mapowanie jeden na jeden.

Widok zawiera odniesienie do Prezentera. Prezenter reaguje również na zdarzenia wyzwalane z Widoku, więc jest świadomy Widoku, z którym jest powiązany.

Prezenter aktualizuje widok na podstawie żądanych działań, które wykonuje na modelu, ale widok nie obsługuje modelu.

MVVM - widok modelu Widok modelu

Więc z wzorami MVC i MVP przed nami, spójrzmy na wzór MVVM i zobaczmy, jakie różnice:

Dane wejściowe zaczynają się od Widoku, a nie Widoku Modelu.

Podczas gdy widok zawiera odniesienie do modelu widoku, model widoku nie ma informacji o widoku. Dlatego możliwe jest mapowanie jeden na wielu między różnymi widokami i jednym modelem widoku… nawet w różnych technologiach. Na przykład widok WPF i widok Silverlight mogą współdzielić ten sam model widoku.

taha027
źródło
7
„To dlatego, że Widok nie ma żadnej wiedzy ani odniesienia do kontrolera” To nie jest prawda
Adam Wolski
@AmirZiarati ViewModel nie jest częścią MVP, ale wzorem MVVM.
Joe
Byłbym dobry, gdybyś podał przykłady, w których moglibyśmy użyć tych wzorów
JKA
3

Zdjęcie poniżej pochodzi z artykułu Erwina van der Valk:

obraz wyjaśniający MVC, MVP i MVVM - autor: Erwin Vandervalk

W artykule wyjaśniono różnice i podano przykłady kodu w języku C #

Jboy Flaga
źródło
Powyższe obrazy nie są mylące, ponieważ w MVC dlaczego WIDOK bezpośrednio uzyskuje dostęp do Modelu? to samo dla innych?
smkrn110
Na tych schematach nie jest jasne, co oznaczają strzałki. Czy strzałka oznacza dostęp lub manipulację? Na schemacie MVC nie jest jasne, dlaczego nie ma strzałki inicjującej z modelu
Pontios