Właściwy widok modelu -_____

14

Czytałem o kontrolerze Model View, Model View Presenter, Model View ViewModel i tak dalej, i ogólnie, podstawowa koncepcja wydaje się dość prosta do zrozumienia: utrzymuj ładne wizualizacje i naukowe odwagi jako osobne i nieświadome siebie jako możliwy. Nie ma logiki masła orzechowego w czekoladzie; spoko, podoba mi się to.

Problem polega na tym, że wciąż jestem trochę rozmyślny, jeśli chodzi o tę trzecią część ... nie-model-lub-widok. Wydaje się, że wszyscy mają własne wyobrażenie o tym, jak to nazwać, co należy zrobić, co jest właściwe, co jest po prostu źle ... i zaczynam wariować, próbując dowiedzieć się, kiedy Prezenter staje się ViewModel, a kiedy View nie powinien robię to, ponieważ taka jest praca Prezentera i ...

Włóczę się

Zamiast prosić kogoś o wyjaśnienie różnicy między nimi - ponieważ to już było robione od czasu do czasu (wiem; czytałem więcej artykułów, niż potrafię zliczyć) - byłbym ciekawy usłyszeć myśli kilku programistów na modelu, który sam stworzyłem.

To powiedziawszy, co sklasyfikowałbyś ten projekt jako, a co ważniejsze, czy widzisz coś w tym, co oczywiście jest do bani? Pewnie, chciałbym usłyszeć, że mam się dobrze, jeśli to naprawdę solidny projekt, ale wolałbym otrzymać solidną radę niż pochwałę.

Uwaga: użyję „Mostu” do tajemniczej trzeciej części Model-View-? aby uniknąć podświadomych sugestii, co to powinno być.

Model

  • Jest autorytetem w zakresie danych.
  • Otrzymuje informacje o żądanych zmianach od mostu.
  • Zawiera i wykonuje całą logikę dotyczącą związku danych z innymi danymi.
  • Informuje mostek o zmianie danych (w przypadku danych, które most wyraził zainteresowanie). Edycja sformułowań: pozwala abonentom zewnętrznym (o których nic nie wie) na monitorowanie stanu lub wyników obliczeń.
  • Ma zerową wiedzę na temat widoku.

Widok

  • Jest zainteresowany zapewnieniem użytkownikowi sposobu przeglądania i manipulowania danymi.
  • Otrzymuje informacje o aktualizacjach danych z mostu.
  • Zawiera i wykonuje całą logikę dotyczącą sposobu prezentacji danych i kontroli użytkownikowi.
  • Informuje Most, gdy użytkownik wykonał czynność, która (prawdopodobnie) wpływa na Model.
  • Informuje Most, jakie informacje są zainteresowane.
  • Ma zerową wiedzę na temat modelu.

Most

  • Jest koordynatorem i tłumaczem między modelem a widokiem.
  • Wprowadza wszelkie odpowiednie zmiany formatowania informacji przekazywanych między modelem a widokiem.
  • Zachowuje informacje o tym „kto musi wiedzieć, co”.
  • Ma wiedzę zarówno na temat modelu, jak i widoku.

Dodatkowe uwagi

  • W bardziej skomplikowanych programach często występuje wiele modeli. W tej sytuacji most zazwyczaj zajmuje się koordynacją / tłumaczeniem między wieloma modelami, a tym samym staje się autorytetem w oparciu o które protokoły / interfejsy API / modele projektowe powinny być budowane. (np. jeśli budujesz program do gry karcianej i chcesz zbudować alternatywny model tasowania talii, powinieneś użyć Mostka do określenia, jakie funkcje są wymagane do prawidłowej komunikacji z Mostem.)
  • W małych prostych programach z tylko jednym widokiem i modelem Bridge często „zakłada”, jakie funkcje są dostępne po obu stronach. Jednak w miarę, jak programy stają się bardziej złożone, zaleca się, aby Widoki i Modele zgłaszały swoją funkcjonalność do Mostu, aby można było uniknąć nieefektywności i błędnych założeń.

Myślę, że to prawie obejmuje. Z całą pewnością jestem wdzięczny za wszelkie pytania dotyczące projektu, którego używam, i zachęcam również do wszelkich sugestii.

I jak zawsze dziękuję za poświęcony czas.

KoratDragonDen
źródło
2
Blok widoku ma błąd kopiowania-wklejenia. Wydaje mi się, że ostatni punkt powinien brzmieć „Ma zerową znajomość modelu”. Ostatnie zdanie pierwszej dodatkowej nuty powinno prawdopodobnie kończyć się na „model”, a nie „pomost”?
Johannes S.

Odpowiedzi:

7

Twoje zdanie

„Jest koordynatorem i tłumaczem między modelem a widokiem”.

wskazuje, że Twój Most jest Prezenterem w architekturze MVP.

MVP i MVC są bardzo podobne, z tym wyjątkiem, że w MVP tylko Prezenter obserwuje Model, podczas gdy w MVC Widok może również bezpośrednio obserwować Model (bez Prezentera jako „Mostka”).

Twoja odpowiedzialność za model

„Informuje mostek o zmianie danych (w przypadku danych, które most wyraził zainteresowanie)”.

jest może źle sformułowany lub może pomyłką: nie chcesz, aby Model był zależny od Mostka / Prezentera / Kontrolera lub Widoku. Zamiast tego używasz wzorca obserwatora, zdarzeń lub programowania reaktywnego, aby umożliwić mostowi subskrybowanie zmian w modelu. Następnie możesz sformułować swoją odpowiedzialność jako:

„Umożliwia zewnętrznym subskrybentom (o których nic nie wie) monitorowanie stanu lub wyników obliczeń”.

Jeśli Twój model nie jest zależny od kontrolera lub widoku, łatwiej go przetestować i jest on znacznie bardziej przenośny.

Larry OBrien
źródło
1
Jeśli kluczową różnicą jest to, że Widok może obserwować Model, a nie może, to projekt jest zdecydowanie bardziej MVP; Widok i model nigdy nie mogą mówić bezpośrednio w projekcie, którego używam.
KoratDragonDen
Myślę, że odpowiedzialność modelu była kiepska. Model tak naprawdę nie ma pojęcia ani nie dba o to, kto / co / dlaczego rzeczy, które chcą go słuchać, ale po prostu opublikuje wszelkie zmiany, które zostały wprowadzone do jego subskrybentów. Jest całkowicie zadowolona z faktu, że istnieje sama, bez żadnych subskrybentów i nie stara się zabiegać o nowych subskrybentów.
KoratDragonDen
1
Wygląda na to, że masz dobry projekt. PS Powodem do rozważenia MVC nad MVP jest to, że bez dyscypliny Prezenter może stać się nadmiernie obciążony.
Larry OBrien
1
+1 za proste podanie różnicy między MVC i MVP. Podobnie jak OP, reszta Internetu całkowicie mnie zatraciła, czy te akronimy były choć trochę inne.
Ixrec
5

Podejrzewam, że jedną z rzeczy, które Cię mylą, jest to, że istnieją dwa zupełnie różne wzorce, które są powszechnie nazywane kontrolerem widoku modelu.

Jest oryginał, zaimplementowany w smalltalk, który jest przydatny dla lokalnych systemów GUI, i jest to, co zwykle uważam za web-mvc, które zamienia niektóre obowiązki widoków i kontrolerów, dzięki czemu kontrolery mogą siedzieć na serwerze z widoki są na kliencie (być może jako renderowany HTML, a może poprzez ajax).

Twój opis brzmi dla mnie tak, jakby mieścił się w większości definicji web-mvc.

Jules
źródło
To może wyjaśnić, dlaczego tak trudno mi było owinąć głowę wokół tej koncepcji. Dziękuję Ci; dobrze wiedzieć, że (prawdopodobnie) nie robię nic strasznie złego z koncepcją MVC.
KoratDragonDen
W przypadku nowoczesnych jednostronnych aplikacji internetowych powróciliśmy do klasycznego wzoru MVC po stronie klienta.
kevin cline
2

Społeczność programistów prowadzi wiele dyskusji na temat tej dokładnej nomenklatury. Wydaje się, że nikt nie zgadza się z niczym.

Dla mnie sposób, w jaki most jest podłączony do widoku, w większości determinuje nazwę.

  • Jeśli może istnieć zbiór widoków na most, oznacza to, że jest to kontroler.
  • Jeśli zawsze jest jeden widok na most, wówczas jest on prezenterem.
  • Jeśli może istnieć zbiór mostów na widok, wówczas most jest modelem widoku.

Czasami rzeczy nie są tak jednoznaczne. Na przykład prezenter może być podłączony do widoku złożonego złożonego z wielu widoków podrzędnych lub można utworzyć kontroler bez wiedzy o jego widokach. Mimo to uważam, że moje zasady są dobrym początkiem.


Na marginesie chciałbym sparować obowiązki w następujący sposób:

Model

Główna odpowiedzialność: Utrzymywanie danych
Role dodatkowe: Sprawdzanie poprawności aktualizacji, powiadamianie obserwatorów o aktualizacjach

Widok

Główna odpowiedzialność: obecne dane
Drugorzędne role: Akceptuj dane wejściowe, obecne UX

Most

Główna odpowiedzialność: Aktualizacja danych
Role dodatkowe: Czyste dane wejściowe, synchronizacja danych i widoków

Jeffery Thomas
źródło
0

Chociaż sugerowany wzór wydaje się poprawny na powierzchni i niewątpliwie będzie działał w małych instancjach, ponieważ aplikacja staje się bardziej złożona, napotkasz problemy, w przypadku których nie masz pewności, które aktualizacje co, kto słucha i gdzie próbuję i dlaczego aby kontrolować tak wiele modeli z tak wielu widoków, z których wszyscy potrzebują dostępu do siebie nawzajem itp.

Polecam poszerzenie swoich pomysłów według następującego wzoru (zaczerpniętego z przemówienia Amy Palamountain Enemy of the State ):

Modele

  • Stan synchronizacji ze składnicą danych
  • Obsługuje sprawdzanie poprawności nowych / zaktualizowanych danych
  • Podnoś zdarzenia, gdy zmieniają stan

Wyświetlenia

  • Szablony renderowania
  • Obsługa zdarzeń modelu
  • Obsługa zdarzeń DOM
  • Pośredniczy w interakcji między modelem a DOM

Kontrolery

  • Zarządza najwyżej kilkoma modelami i widokami
  • Śledzi widoki w kontenerze

Moduły

  • Logiczne grupowanie kontrolera oraz jego widoki i modele
  • Testowalny
  • Mały i łatwy w utrzymaniu (pojedyncza odpowiedzialność)
  • Koordynuje (za pośrednictwem kontrolera) stan i zdarzenia zawartych w nim widoków i modeli
  • Bezpłatnie prezentować własne widoki
  • Nie można wybrać, gdzie zaprezentować swoje widoki

Menedżer układu

  • Odpowiedzialny za kompozycję układu
  • Definiuje powłokę aplikacji w DOM z obszarami, w których Moduły mogą prezentować swoją zawartość

Dyspozytor

  • Słucha zdarzeń (przez globalny strumień PubSub)
  • Odpowiedzialny za ładowanie nowych modułów na podstawie zdarzeń
  • Przekaż załadowane moduły do ​​Menedżera układu
  • Zarządza całym cyklem życia modułu (tworzenie, czyszczenie, buforowanie itp.)
  • Przykłady wydarzeń:
    • Zmiany trasy (w tym początkowa trasa ładowania)
    • Interakcja z użytkownikiem
    • Zdarzenie modułu wywołane bąbelkowo ze zdarzenia Model z powodu zmiany stanu po stronie serwera itp

Podanie

  • Odpowiedzialny za ogólną konfigurację, tworzy takie rzeczy jak:
    • Dyspozytor
    • Router
    • Strumień PubSub
    • Rejestratory
    • itp

Tego rodzaju wzorzec umożliwia komponowanie aplikacji, testowanie jednostkowe, eliminuje złożoność, którą z czasem narastałby Most, ładnie rozdzielał obawy itp.

Jak zauważa Amy: Uważaj, aby nie zbudować serwera na kliencie. I uważaj, aby nie popaść w doktrynę: „Tworzę szkielet MV *, dlatego muszę ___!” Zamiast tego weź wszystkie te pomysły (i inne odpowiedzi tutaj) i znajdź to, co najlepiej pasuje do Twojej aplikacji i zespołu.

Gorąco polecam obejrzenie przemówienia Amy Palamountain „ Wróg państwa” (z którego pochodzą te pomysły) lub przynajmniej obejrzenie slajdów z przemówienia .

Jess Telford
źródło