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.
źródło
Odpowiedzi:
Twoje zdanie
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
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:
Jeśli Twój model nie jest zależny od kontrolera lub widoku, łatwiej go przetestować i jest on znacznie bardziej przenośny.
źródło
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.
źródło
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ę.
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
źródło
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
Wyświetlenia
Kontrolery
Moduły
Menedżer układu
Dyspozytor
Podanie
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 .
źródło