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”?
źródło
Odpowiedzi:
MVC jest koncepcyjnie elegancki:
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:
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:
źródło
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.
źródło