34

Mam bardzo dobry pomysł, jak każdy z tych wzorów działa i wiem o niewielkich różnicach między nimi, ale czy tak naprawdę różnią się one od siebie?Jakie są różnice między prezenterem, modelem prezentacji, ViewModel i kontrolerem?

Wydaje mi się, że prezenter, model prezentacji, ViewModel i kontroler są zasadniczo tą samą koncepcją.

Dlaczego nie można zaklasyfikować wszystkich tych pojęć jako kontrolerów? Czuję, że to może uprościć cały pomysł.

Czy ktoś może podać dokładny opis różnic?

Chcę wyjaśnić, że rozumiem, jak działają wzorce i większość z nich wprowadzono w jednej lub w innej technologii. Czego tak naprawdę szukam, to czyjeś doświadczenie z jednym z tych wzorców i dlaczego na przykład nie uważają ich ViewModel za kontroler.

Podam kilka punktów reputacji za to, ale szukam naprawdę dobrej odpowiedzi.

Odpowiedz

42

Poza wspomnianą już świetnie czyta (Fowler & Miller) i odpowiedzieć na swoim miejscu na różnice pomiędzy kontrolera/prezenter/... z punktu widzenia dewelopera:

Controller w MVC:

  • Kontroler to rzeczywisty składnik, który zostaje wywołany w wyniku interakcji użytkownika. (Deweloper nie trzeba pisać kod do delegowania połączeń do kontrolera.)

  • Kontroler pobiera aktualne wartości jakoś z widoku/kontekstowego/worka/cokolwiek, ale nie naprawdę powiedzieć, że współdziała z widokiem .

  • Kontroler decyduje w końcu, który widok, aby pokazać użytkownikowi. W tym przypadku kontroler pokazuje również wyraźne pojęcie przepływu pracy aplikacji.

Presenter w MVP:

  • Presenter posiada metody zwane przez widok, który jest rzeczywisty składnik otrzymaniu kontrolę po interakcji użytkownika. (Programista musi napisać jakiś kod w widoku, aby zadzwonić do prezentera.)

  • Prezenter pobiera wartości bieżące w jakiś sposób z widoku lub odbierać je z widoku podczas połączenia. Metody wywołujące wywołania w widoku, aby ustawić jego stan (zapełnić go mówi Josh Smith). Metoda widoku wywoływana przez prezentera może mieć kilka małych ustawień wykonanych w jego ciele.

  • Prezenter nie jawnie pokazuje pojęcie przepływu pracy aplikacji. Zwykle uważa się, że powraca ona do widoku wywołującego.

PresentationModel w PM:

  • PresentationModel posiada metody zwane przez widok, który jest rzeczywisty składnik otrzymaniu kontrolę po interakcji użytkownika. (Programista musi napisać kod w widoku w celu wywołania PresentationModel.)

  • PresentationModel ma znacznie więcej rozmowni komunikację z widokiem porównaniu do prezentera. Zawiera również więcej logiki, aby określić wartość wszystkich ustawień do zastosowania w widoku i faktycznie ustawić je w widoku. (Te metody View po kolei nie mają prawie żadnej logiki).

  • PresentationModel nie wyświetla jawnie pojęcia przepływu pracy aplikacji. Zwykle uważa się, że powraca ona do widoku wywołującego.

ViewModel w MVVM:

  • ViewModel posiada metody zwane (& właściwości ustawione) przez widok, co jest rzeczywistą Element odbierający kontrolnych po interakcji użytkownika. (Programista musi napisać jakiś (deklaratywny) kod w widoku, aby zadzwonić do ViewModel.)

  • ViewModel nie ma wyraźnie rozmownej komunikacji z View w porównaniu do PresentationModel (tzn. Nie wywołuje View more, the framework czy to). Ale ma wiele właściwości, które odwzorowują od 1 do 1 w ustawieniach widoku. Wciąż zawiera tę samą logikę, aby ustalić wartość wszystkich tych ustawień.

  • ViewModel nie wyświetla jawnie pojęcia przepływu pracy aplikacji. Zwykle uważa się, że powraca ona do widoku wywołującego.

  • Kopiowanie w jakiś sposób, co mówi Josh Smith (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx): Wzorzec MVVM to szczególny przypadek PM, który korzysta z frameworka (takiego jak WPF/SL), aby pisać mniej kodu.

+0

Czy możesz wspomnieć coś o tym, które z tych wzorców projektowych są używane w różnych frameworkach (ASP.NET MVC, WPF, SL)? –

+0

Absolutnie nie zakładam, że wiem * wszystkie * ramy wokół. Wspomniałeś .NET ones: ASP.NET MVC, z 'Widokami' i' Kontrolerami' jest dość przylegające do MVC (to samo powinno być dla Ruby on Rails); WPF/SL są dość spójne z MVVM z komponentami "XAML" i C# z tyłu. Dla mnie Caliburn.Micro jest jeszcze bliżej MVVM w swoim pierwszym podejściu ViewModel. Nawet jeśli mam nazwę MV *, AngularJS jest również dla mnie przykładem MVVM, pod warunkiem, że widok nie zawiera zbyt wiele kodu. – superjos

1

Przynajmniej w .Net, MVP jest używany jako wzorzec projektowy. Zwykle jest to używane w aplikacjach Windows Forms lub klasycznej ASP.Net. W przypadku MVC i MVVC są one zwykle używane z ASP MVC, który wykorzystuje dość odmienną architekturę niż zwykła ASP.Net.

5

Różnica między nimi polega zasadniczo na tym, ile kodu znajduje się w widoku. Wybór między nimi jest w rzeczywistości wyborem technologii do zastosowań takich jak WFP, WinForms, ASP MVC (2). Podstawowa idea oddzielania logiki od prezentacji jest taka sama.

Here to bardzo dobry artykuł o wszystkich trzech.

EDIT:

One więcej artykuł - porównanie.

+0

Widziałem wiele artykułów na ten temat, ale nie tego. Wygląda bardzo kompletnie, dzięki. Chciałbym jednak wspomnieć, że jedynym wzorem zależnym od technologii jest MVVM, a nawet ten może być zaimplementowany identycznie na przykład w środowisku Flex. – Nicholas

0

Moim zdaniem, nie ma rzeczywistych różnic koncepcyjnych między MVP, MVVC, MVC i modelem prezentacji. Istnieją pewne różnice szczegółowe, ale ostatecznie wszystkie mogą być nadal uważane za konfigurację kontrolera widoku modelu. Dodatkowe nazewnictwo służy tylko do wprowadzenia zamieszania i myślę, że lepiej byłoby przyjąć terminologię, która pozwala na pewną swobodę w opisywaniu kontrolera.

+1

Twoim zdaniem? Uważam, że PO zwrócił się o odpowiedź, a nie o opinie. Poza tym istnieją wyraźne różnice. Moim zdaniem ta odpowiedź była zła. – Tower

+6

@Tower Ha aha h ... To ja zadałem pytanie inteligentnemu facetowi. – Nicholas

+1

To jest bezcenne. – dcow

34

Martin Fowler ma stronę na temat wzorców projektowych interfejsu użytkownika, w której definiuje, a następnie mówi o MVC, MVP i innych wzorach.

http://martinfowler.com/eaaDev/uiArchs.html

Kontroler jest aktywny w zwalczaniu UI. Na przykład obsłużyłby wszystkie zdarzenia wywołane przez interfejs użytkownika i odpowiednio sobie z nimi poradził.

Z drugiej strony, podajnik jest bardziej pasywny i po prostu wyświetla dane za pośrednictwem interfejsu użytkownika, który obsługuje własne zdarzenia itp. Lub przekazuje je za pośrednictwem prezentera do usługi lub polecenia.

A ViewModel jest specyficznym przykładem prezentera, zaprojektowanym do użytku z wiązaniem WPF/Silverlight.

Model prezentacji to model, który można przedstawić bezpośrednio w widoku, więc na przykład, jeśli modele implementują INotifyPropertyChanged dla powiązania danych, będą to modele prezentacji.

Powiązane problemy