Model-View-Controller: Czy użytkownik wchodzi w interakcję z View lub z kontrolerem? [Zamknięte]

14

Niedawno dowiedziałem się o wzorcu projektowym MVC. Uczę się z książki Wzorzec pierwszego projektu.

Zgodnie z tą książką (jeśli dobrze rozumiem):

Model to większość logiki i danych aplikacji.

Widok jest w zasadzie GUI, który reprezentuje model wizualnie dla użytkownika.

Administrator jest odpowiedzialny za „mediację” i działanie jako „pośrednik” między Widokiem a Modelem. Widok informuje kontroler, że użytkownik wykonał akcję, a kontroler tłumaczy to na wywołania metod w modelu.

Jednak wiele miejsc w Internecie jest sprzecznych z tym, co rozumiem z tej książki. Twierdzą, że ogólnie użytkownik wchodzi w interakcje z kontrolerem, a nie z widokiem.

Który z nich jest prawdziwy czy powszechniejszy? Czy użytkownik wchodzi w interakcję bezpośrednio z kontrolerem, czy bezpośrednio z widokiem? Czy oba podejścia są dopuszczalne? Który jest bardziej powszechny?

Aviv Cohn
źródło
4
Na to pytanie nie ma znaczącej odpowiedzi w sposób, w jaki je napisałeś. Podaj przykład jednego z miejsc w sieci, które są sprzeczne z książką, a my postaramy się to wyjaśnić. Bądź konkretny w swoim przykładzie.
Robert Harvey
1
Dwie odpowiedzi, obie wzniosłe, jedna mówi „interakcja z widokiem”, druga mówi „interakcja z kontrolerem” .... sprawia, że ​​myślę, że MVC nie jest całkiem dobrą architekturą, jeśli jest to mylone na tak podstawowym poziomie!
gbjbaanb
Czy klikasz elementy sterujące aplikacji lub zapytania do bazy danych? Interakcja odbywa się bezpośrednio z interfejsem użytkownika, który sam jest widokiem. Widok zwykle wywołuje żądania do serwera (w przypadku aplikacji internetowych) lub wywołuje zarejestrowane na nich haki (w przypadku aplikacji klienckich). Poza tym całe MVC to tylko bzdura.
luke1985
@spectre Odrzucenie MVC nie jest przydatne bez podania wyjaśnienia i, najlepiej, alternatywy. W przeciwnym razie to zwolnienie nic nie wnosi i powinno zostać pominięte w komentarzu. Poza tym, nawet z tym, byłoby to nadal nie na temat.
underscore_d

Odpowiedzi:

18

Użytkownik wchodzi w interakcję z widokiem , ale widok musi komunikować działania kontrolerowi . Kontroler może zaktualizować model , ale nie jest to konieczne z każdego / każdej zmianie.

Podany przeze mnie opis opiera się na moich osobistych doświadczeniach z implementacją MVC .NET. Twoja implementacja może być inna.

Controller gdzie działania są przetwarzane, w zasadzie warstwę biznesową. Prosty kontroler nie zrobi nic poza pobraniem danych z Modelu i przesłaniem ich do Widoku. Skomplikowany kontroler wykona wszelkiego rodzaju czynności, aż do zarządzania bezpieczeństwem, uwierzytelniania, autoryzacji, rejestracji i ewentualnie wielu innych rzeczy.

Zobacz powinien być odpowiedzialny za wyświetlanie informacji w sposób, że użytkownik może zrozumieć tylko. Może być tu trochę skrzyżowania zarówno z kontrolerem, jak i modelem, ponieważ takie rzeczy, jak aplikacje pojedynczej strony (SPA), będą zawierały informacje zwrotne dotyczące weryfikacji danych dla użytkownika. Wszelkie inne zwroty krzyżowe są bardzo rozczarowane.

Model wykorzystujący dane. Obejmuje to sprawdzanie poprawności danych (w stosownych przypadkach). W tej warstwie obsługiwane jest również przechowywanie i pobieranie danych.


AKTUALIZACJA

Wydaje się, że istnieje pewne zamieszanie wokół tego, kto co robi, kiedy. Dołączyłem dwa różne przeglądy architektur MVC, ponieważ są one podobne, ale nie takie same. Jest miejsce na każdą interpretację. Być może o wiele więcej. Powyższe opisy to moja interpretacja MVC z wielu źródeł, w tym z własnego doświadczenia w tworzeniu aplikacji przy użyciu tej metodologii. Mamy nadzieję, że ta aktualizacja pomoże rozwiązać niektóre z tych problemów.

MVC jest próbą zbudowania wzoru projektowego Separation of Concerns na potrzeby rozwoju oprogramowania. Zostało to przede wszystkim zaimplementowane w aplikacjach internetowych (o ile mi wiadomo).

View obsługuje wszystkie interakcje użytkownika. Jeśli użytkownik kliknie przycisk, widok określa, czy kliknięcie to interakcja interfejsu użytkownika, czy coś, co jest poza jego zasięgiem (interakcja kontrolera). Jeśli przycisk robi coś takiego jak kopiowanie wartości z jednego pola do drugiego, twoja implementacja określi, czy jest to problem z widokiem, czy problem z kontrolerem. Najprawdopodobniej będziesz miał tylko to zatarcie obaw w przypadku aplikacji jednostronicowej (SPA).

Kontroler jest gdzie twoje działania są przetwarzane. Widok poinformował użytkownika, że ​​postanowił zmienić wartości dla niektórych pól. Administrator może przeprowadzić walidację tych danych lub może być obsługiwany przez Model. Znowu zależy to od implementacji. Jeśli kontroler ma funkcje zabezpieczeń, może stwierdzić, że użytkownik nie ma wystarczających uprawnień do wykonania akcji. Odrzuci zmiany i odpowiednio zaktualizuje widok. Kontroler określa również, jakie dane należy pobrać z modelu, jak go spakować i zaktualizować widok o te dane.

Modelu określa, jak i gdzie przechowywać dane. Może także przeprowadzić weryfikację tych danych przed ich zapisaniem (powinno to zrobić, ponieważ ludzie czasami omijają widok).


Wikipedia ma artykuł na temat MVC .

  • Modelu powiadamia z towarzyszącym mu widok / widoki i kontrolery gdy nastąpiła zmiana w jego stanie. To powiadomienie pozwala widokom na aktualizację ich prezentacji, a kontrolery na zmianę dostępnego zestawu poleceń. W niektórych przypadkach implementacja MVC może zamiast tego być „pasywna”, więc inne komponenty muszą sondować model w poszukiwaniu aktualizacji, a nie otrzymywać powiadomień.
  • Widok jest opowiedziana przez kontroler wszystkich informacji niezbędnych do generowania reprezentacji wyjściowy dla użytkownika. Może również zapewniać ogólne mechanizmy informowania kontrolera o danych wejściowych użytkownika.
  • Kontroler może wysyłać polecenia do modelu zaktualizować stan modelki (np edycji dokumentu). Może także wysyłać polecenia do powiązanego widoku, aby zmienić prezentację modelu w widoku (np. Przewijając dokument).

Z przeglądu MVC firmy Microsoft .

  • Modele Obiekty modelu to części aplikacji, które implementują logikę dla domeny danych aplikacji. Często obiekty modelu pobierają i przechowują stan modelu w bazie danych. Na przykład obiekt Product może pobierać informacje z bazy danych, działać na niej, a następnie zapisywać zaktualizowane informacje z powrotem do tabeli Products w bazie danych SQL Server.

    W małych aplikacjach model jest często separacją konceptualną zamiast fizyczną. Na przykład, jeśli aplikacja odczytuje tylko zestaw danych i wysyła go do widoku, aplikacja nie ma warstwy modelu fizycznego i powiązanych klas. W takim przypadku zestaw danych przyjmuje rolę obiektu modelowego.

  • Wyświetlenia. Widoki są komponentami wyświetlającymi interfejs użytkownika aplikacji (UI). Zazwyczaj ten interfejs użytkownika jest tworzony z danych modelu. Przykładem może być widok edycji tabeli Produkty, która wyświetla pola tekstowe, listy rozwijane i pola wyboru w oparciu o bieżący stan obiektu Produkt.

  • Kontrolery Kontrolery to komponenty, które obsługują interakcję użytkownika, pracują z modelem i ostatecznie wybierają widok do renderowania, który wyświetla interfejs użytkownika. W aplikacji MVC widok wyświetla tylko informacje; kontroler obsługuje i reaguje na dane wejściowe i interakcje użytkownika. Na przykład kontroler obsługuje wartości ciągu zapytania i przekazuje te wartości do modelu, który z kolei może użyć tych wartości do wysłania zapytania do bazy danych.

Adam Zuckerman
źródło
Co jeśli nie masz GUI dla wszystkich działań? Co jeśli masz zaimplementowane API tylko dla niektórych określonych części? Czy to oznacza, że ​​użytkownik czasami wchodzi w interakcję z widokiem, a czasem bezpośrednio z kontrolerem?
Mahdi
1
Z mojej perspektywy nie. Interfejs API zastępuje widok.
Adam Zuckerman
ale interfejs API może być prosty url-routes, umieszczony w Controller. Mam na myśli brak widoku ...
Mahdi
1
@AdamZuckerman Dzięki za odpowiedź. W następnym komentarzu opiszę, jak myślę, że działa wspólna implementacja MVC, proszę potwierdzić, czy jest poprawna, czy nie. Dzięki
Aviv Cohn
2
@Mahdi Interfejs API z definicji istnieje jako interfejs programowania , a nie interfejs użytkownika . Programy współpracują z interfejsem API, użytkownicy wchodzą w interakcję z widokiem.
Eric King
4

Użytkownik wchodzi w interakcję z kontrolerem . Z technicznego punktu widzenia nie wchodzisz w interakcję z widokiem , po prostu używasz go do interakcji z kontrolerem .

Na pierwszy rzut oka wydaje się, że użytkownik wchodzi w interakcję z graficznym interfejsem użytkownika - również dla osób niebędących programistami ma to większy sens, jednak klikając przycisk, w zasadzie rozmawiasz z kontrolerem, a nie z widokiem .

Również nie wszystkie aplikacje - nawet aplikacje internetowe MVC, mają GUI. Możesz wchodzić w interakcje z kontrolerem za pośrednictwem interfejsu API - po prostu prosty, url-routesna przykład umieszczony w samym kontrolerze .

Kontroler powinien być miejscem, które odbiera i Uchwyty żądania użytkownika. Więc jeśli w jakiś sposób uzyskujesz dostęp do Modelu bezpośrednio z widoku - nie ważne jak, to nie jest już MVC .

Mahdi
źródło
2
+1 To jest poprawne. Rzeczy takie jak menu i paski narzędzi są częścią GUI, ale nie są częścią widoku, i przechodzą bezpośrednio do kontrolera. Podobnie naciśnięcia klawiszy.
david.pfx
1
Widoki istnieją jako abstrakcja, dlatego w razie potrzeby możemy je łatwo zastąpić. Kontroler aplikacji na różnych platformach może być taki sam, ale widoki muszą inaczej rozpoznawać gesty użytkownika i przekładać je na operacje kontrolera. Dlatego nie zgadzam się z tym, że użytkownicy wchodzą w interakcje bezpośrednio z kontrolerami.
Fuhrmanator
1
@Mahdi Powiedziałbym, że w takim przypadku nie ma żadnej interakcji użytkownika, jest to widok komunikujący się programowo z kontrolerem. Jedynymi interakcjami inicjowanymi przez użytkownika są widok.
Eric King
1
@ david.pfx Klawisze nie mogą przejść bezpośrednio z okna przeglądarki do kontrolera.
Adam Zuckerman
1
@Izkata „Widok jest częścią kodu, do którego wysyłane są żądania” - przepraszam, ale to najgorsza rzecz, jaką tu słyszałem. Jak to jest w ogóle możliwe? Czy możesz to zrobić, podając odniesienie w artykule lub książce?
Mahdi
1

Użyjmy konkretnego przykładu, dlaczego użytkownicy wchodzą w interakcje bezpośrednio z widokami, a nie z kontrolerami.

W aplikacji muzycznej na iPhonie funkcją wysokiego poziomu jest odtwarzanie listy odtwarzania. „Odtwórz listę odtwarzania” to funkcja kontrolera aplikacji.

Istnieje więcej niż jeden sposób aktywacji tej funkcji. Mogę kliknąć listę odtwarzania w aplikacji lub poprosić Siri (interfejs głosowy) o wykonanie tej samej funkcji. Są to dwa różne gesty rozpoznawane przez różne poglądy.

Informacje zwrotne w każdym widoku są również inne. Siri powie ci, że odtwarza żądaną muzykę. Aplikacja muzyczna wyświetli wizualną informację zwrotną na temat odtwarzania listy odtwarzania.

Fuhrmanator
źródło