Jakie są ulepszenia MVP w stosunku do MVC?

49

Przez trzy dni czytałem o wzorcach Model-View-Controller (MVC) i Model-View-Presenter (MVP) . I jedno pytanie bardzo mnie niepokoi. Dlaczego projektanci oprogramowania wymyślili MVP, skoro już istniał MVC?

Jakie napotkali problemy, których MVC nie rozwiązało (lub rozwiązało źle), ale MVP może rozwiązać? Jakie problemy ma rozwiązać MVP?

Czytałem wiele artykułów o historii i wyjaśnieniach MVP lub różnicach między MVC i MVP, ale żaden nie miał jasnej odpowiedzi na moje pytania.

W jednym z artykułów, które czytałem, powiedziano:

Teraz na Presenter widoku modelu, który był odpowiedzią na niedoskonałości wzoru MVC po zastosowaniu go do nowoczesnych graficznych interfejsów użytkownika opartych na komponentach. W nowoczesnych systemach GUI same komponenty GUI obsługują dane wejściowe użytkownika, takie jak ruchy myszy i kliknięcia, a nie niektóre kontrolery centralne.

Nie mogę więc zrozumieć, ale czy może być inaczej, tak aby komponenty GUI same nie obsługiwały danych wprowadzanych przez użytkownika? A co dokładnie oznacza „poradzić sobie sami”?

Zwycięzca
źródło
4
Myślę, że to tylko „Nowe ubrania cesarza”, nowe modne hasło od Mickeysoft.
qwerty_so
4
Victor, masz konkretne pytanie inne niż „dlaczego istnieją dwa różne wzorce?” Istnieją dwa różne wzorce, ponieważ rozwiązują ten sam problem na dwa nieco różne sposoby. Jeśli to pomaga, Model i Widok są zasadniczo takie same w obu wzorach. Skoncentruj się na różnicach między kontrolerem a prezenterem. Więcej pomocy można znaleźć tutaj: linkedin.com/pulse/...
Robert Harvey
18
„Przez trzy dni czytałem o wzorcach MVC i MVP”. Yikes. Sugeruję, aby wziąć relaksującą gorącą kąpiel lub pominąć trochę kamieni przez staw wypełniony kaczką lub coś w tym rodzaju. Ten rodzaj czytania może przy braku jakiegokolwiek praktycznego zastosowania naprawdę stopić mózg!
user1172763,
11
Sposób, w jaki chcesz uzyskać odpowiedź, którą chcesz, to budowanie czegoś przy użyciu tych wzorów. Wtedy zostaniecie oświeceni.
Robert Harvey

Odpowiedzi:

63

MVC jest koncepcyjnie elegancki:

  • dane wejściowe użytkownika są obsługiwane przez kontroler
  • sterownik aktualizuje model
  • model aktualizuje widok / interfejs użytkownika
           +---+
      +----| V |<----+
user  |    +---+     | updates
input |              |
      v              |
    +---+          +---+
    | C |--------->| M |
    +---+ updates  +---+

Jednak: Przepływ danych i zdarzeń w MVC jest okrągły. Widok często zawiera znaczącą logikę (np. Procedury obsługi zdarzeń dla akcji użytkownika). Wszystkie te właściwości sprawiają, że system jest trudny do przetestowania i trudny w utrzymaniu.

Architektura MVP zastępuje kontroler prezenterem, który pośredniczy między widokiem a modelem. To linearyzuje system:

       user input         updates
+---+ -----------> +---+ --------> +---+
| V |              | P |           | M |
+---+ <----------- +---+ <-------- +---+
        updates            updates

Ma to następujące zalety:

  • Logikę (np. Procedury obsługi zdarzeń i stan interfejsu użytkownika) można przenieść z widoku do prezentera.

  • Interfejs użytkownika może być testowany jednostkowo pod kątem prezentera, ponieważ opisuje stan interfejsu użytkownika. W teście jednostkowym zastępujemy widok sterownikiem testowym, który wywołuje prezentera.

  • Ponieważ interfejs użytkownika jest odizolowany od logiki aplikacji, oba można opracować niezależnie.

Ale to podejście ma również pewne wady:

  • Wymaga większego wysiłku.
  • Prezenter może łatwo przekształcić się w niemożliwą do utrzymania „klasę boską”.
  • Aplikacja nie ma jednej osi MVP, ale wiele osi: jedna dla każdego ekranu / okna / panelu w interfejsie użytkownika. Może to albo uprościć twoją architekturę, albo strasznie ją skomplikować.
amon
źródło
7
Dobra odpowiedź, ale współczesne MVC na ogół nie wykorzystuje dużo (jeśli w ogóle) procedur obsługi zdarzeń, z wyjątkiem być może lokalnej weryfikacji formularzy i nie uważam tych zdarzeń za właściwe MVC. Właśnie dlatego mamy MVP i MVVM. MVC jest zasadniczo po stronie serwera.
Robert Harvey
@amon, dziękuję za odpowiedź, mówi mi wiele rzeczy. I wspominasz, że posiadanie kilku osi w aplikacji może uprościć architekturę. Spełniam ten pomysł w wielu artykułach i wspomniano o nim jako o jednym z głównych powodów wynalezienia MVP, ponieważ MVC nie spełnia złożonych wymagań GUI. To znaczy, które wymagania MVP pasują i jak je rozwiązuje? Przepraszam za bycie upartym, ale NAPRAWDĘ różdżkę, aby dobrze to zrozumieć.
Victor
4
@Victor Nie ma najlepszego wzorca, ale kompromisy są różne. MVC może być dopasowany do skomplikowanych wymagań. Pod względem architektury MVP wymusza relację 1: 1 między widokami i prezenterami: każdy widok ma własnego prezentera, każdy prezenter jest połączony z jednym widokiem. W MVC istnieje relacja n: m: jeden widok może wysyłać dane wejściowe użytkownika do wielu różnych kontrolerów, a jeden kontroler może odbierać dane wejściowe z wielu widoków. Jest to bardziej elastyczne, ale także bardziej chaotyczne - w MVC nie ma wyraźnej „osi”.
amon
1
@Victor Nie mam dużego doświadczenia z GUI, więc prawdopodobnie wiele nie wspomniałem. Ostatni graficzny interfejs użytkownika, który zrobiłem, był absolutnym bałaganem, ponieważ w tym momencie nie wiedziałem o MVP - zlinearyzowany przepływ danych i kontroli byłby ogromną poprawą.
amon
9
@RobertHarvey Twierdziłbym, że to, co sieć nazywa „MVC”, nigdy nie było tak naprawdę „MVC” według oryginalnej definicji. Ktokolwiek przejął akronim, powinien zostać trafiony do góry nogami za wybranie załadowanego terminu i wprowadzanie wszystkich w błąd.
jpmc26
6

W MVP prezenter zastępuje kontroler MVC. Różnica między nimi polega na tym, że Prezenter bezpośrednio manipuluje widokiem. Jest przeznaczony dla struktur interfejsu użytkownika, które są przede wszystkim sterowane zdarzeniami (jak Windows Forms) bez intensywnego wsparcia dla bogatego wiązania danych, które nadawałoby się do wzorca MVVM (jak WPF). W przeciwnym razie logika zarządzania stanem widoku i aktualizowania modelu kopii zapasowej leżałaby w samym widoku.

Michael Brown
źródło