Jaki jest właściwy schemat MVC dla aplikacji webowej?
Który diagram MVC jest prawidłowy? Każdy ma inne strzały...
Diagram 1
Diagram 2
(źródło: stannard.net.au)
Diagram 3
Diagram 4
(źródło: sun.com)
Diagram 5
(źródło: shopno-dinga.com)
7 answers
Wszystkie są.
MVC jest niejasnym wzorem.
Mój pogląd na MVC jest taki :
Controller
Obiekt posiada kolekcję modeli i posiada metody do przeglądania i edycji modeli. Rozmawia z modelami i zwraca instancje widoków z zastosowanymi na nich modelami.
Widok
Ma dołączoną definicję modelu i jest tylko zestawem funkcji do wyświetlania określonego modelu.
Model
Enkapsuluje data. Posiada metody zwracania stanu i zmiany stanu.
//Controller
import Views
class Controller
private Models
//View
import Model
class View
//Model
class Model
Model nie musi wiedzieć nic o widoku / kontrolerze. Pogląd musi znać definicję modelu. Kontroler musi posiadać modele i znać definicje widoków.
Można je połączyć bardziej ciasno, to jest opcjonalne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-11 15:56:30
MVC, ściśle mówiąc, jest rodzajem przestarzałego wzorca. Mówiąc gruboziarnisto, wprowadza zależności między widokiem a modelem, ponieważ Model aktualizuje status widoku bezpośrednio ( http://www.mimuw.edu.pl / ~sl/teaching/00_01/Delfin_EC/Overviews/MVC.htm), Jak pokazano na diagramie 4, gdzie widać bezpośrednie interakcje między modelem a widokiem, zgodnie z oryginalnym, historycznym sformułowaniem MVC, a to nie jest pożądane. W rzeczywistości, dzisiaj mamy zmodyfikowane wersje MVC, a czasami opisujemy MVP i nazwij to MVC. Akronim " MVC " został użyty z tak dużą swobodą, że wszystko, gdzie masz trzy elementy zwane modelem, widokiem i kontrolerem, jest w zasadzie MVC, pomimo szczegółów implementacji i definicji odpowiedzialności. Różnica jest naprawdę subtelna między MVC i MVP, kiedy je opisujesz, i polega na definicji obowiązków View i Presenter (Controller). Martin Fowler pożegnał MVP (i MVC) kilka lat temu ( http://www.martinfowler.com/eaaDev/ModelViewPresenter.html ), a z jego strony możemy znaleźć definicję "nowego" wzorca zwanego modelem prezentacji (patrz http://martinfowler.com/eaaDev/PresentationModel.html ), lub PM. Microsoft zdefiniował dla swoich technologii WPF i Silverlight inny wzór, zwany Model-View-View-Presenter lub MVVM (zobacz http://msdn.microsoft.com/en-us/magazine/dd419663.aspx ), który ma Model prezentacji jako swoją inspirację. Myślę, że ty można spojrzeć na tych wszystkich facetów i dowiedzieć się, jak bardzo podobne (i różne) są. Moim skromnym zdaniem, podstawową ideą jest to, że dane i zachowanie prezentacji pozostają w prezenterze, Model nie zna widoku (więc diagram 4 jest wyłączony, nawet będąc MVC) i powinieneś być w stanie zmienić widok (lub obsługiwać różne implementacje widoku) w bezbolesny sposób, oddzielony zarówno od prezentera, jak i modelu. Model prezentacji może to zapewnić i jest skuteczny i dokładny do wdrożenia przy użyciu aktualnych technologie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-03 20:48:16
W rzeczywistości jest mała różnica.
Istnieją dwa typy modeli: Model aktywny i model pasywny: pierwszy z nich ma mechanizm powiadamiania, a drugi nie jest po prostu nieświadomy użycia w MVC.
Pierwszy i czwarty diagram przedstawiają MVC z aktywnym modelem.
Więcej na ten temat można przeczytać tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-11 15:51:13
Diagramy 1 i 4 są poprawnymi wzorcami MVC. Reszta jest bliższa wzorcowi MVP.
Chociaż w Web MVC masz pasywny Model i zmiany są ciągnięte przez Widok Z modelu, zamiast być popychane przez Model (wzorzec obserwatora ).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-11 16:08:20
Żaden z nich nie jest w rzeczywistości zły, ale istnieje inne podejście do MVC opartego na web (request/response) i MVC po stronie klienta.
W środowisku webowym kontroler jest odpowiedzialny za obsługę żądania użytkownika, modyfikację modelu (jeśli dotyczy), znalezienie odpowiedniego widoku, przypisanie informacji o modelu do widoku i zwrócenie go użytkownikowi.
W bardziej bezpośredniej interpretacji oryginalnego wzorca MVC (speak desktop applications) model aktualizuje widok bezpośrednio, za każdym razem, gdy się zmienia, a kontroler zajmuje się wprowadzaniem przez użytkownika i logiką aplikacji, odpowiednio aktualizując model. Nie działa to jednak w przypadku zwykłych aplikacji internetowych, ponieważ HTTP jest bezpaństwowy i bez użycia jakiejkolwiek innej nowszej technologii (jak long polling Ajax lub websockets, jak wspomniano w komentarzu) serwer nie może tak naprawdę powiadomić klienta o zmianach w modelu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-11 15:54:28
Diagramy 2, 3 i 5 są dokładne dla MVC. Po wysłaniu żądania do kontrolera wykonuje on operację za pomocą modeli, a następnie odpowiada.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-22 07:45:58
Diagram 1 jest prawidłowym odwzorowaniem wzorca MVC.
Linie stałe reprezentują rzeczywiste odniesienie, jak w zmiennej. Oznacza to, że należy spodziewać się wystąpienia modelu zarówno w widoku, jak i w kontrolerze.
Linie przerywane reprezentują wywołania funkcji lub wiadomości między sobą. Przerywana linia od modelu do widoku jest zaimplementowana za pomocą wzorca Observer, gdzie coś się zmieniło na modelu i ma odniesienie do widoku (poprzez API obserwatora modelu), gdzie wywołuje na nim metodę. Coś w rodzaju observer[i].update("name", value, self)
, które będzie wywoływane w modelu, gdy coś się zmieni.
Przerywana linia pomiędzy widokiem a kontrolerem to Widok wysyłający wiadomość do kontrolera. Wyobraź sobie przycisk w interfejsie użytkownika, który został kliknięty. Kontroler nasłuchuje tego zdarzenia i obsługuje je.
Przykładem przepływu komunikacji będzie kliknięcie przycisku: View wysyła wiadomość do kontrolera. Kontroler obsługuje, że zdarzenie, gdzie aktualizuje instancję modelu, powiedzmy model.name
. Model posiada metodę setter
, która aktualizuje name
i wywołuje metodę podobną do changed
, która następnie zapętla obserwatorów i wywołuje .update
na każdym obserwatorze. Widok poprzednio subscribed
do modelu i zostanie wywołany update
ze starymi i nowymi wartościami name
. Metoda update
w widoku aktualizuje wartość nazwy w label
. Załatwione.
Slide deck opisujący MVC: https://pl.csie.ntut.edu.tw/ ~ ctchen / pdf / InsideSmalltalkMVC-public. pdf
C2 Wiki MVC artykuł: http://wiki.c2.com/?ModelViewController
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-20 14:42:48