Problem MVC
polega na tym, że ludzie myślą, że widok, kontroler i model muszą być od siebie jak najbardziej niezależne. Nie są - widok i kontroler są często ze sobą powiązane - uważają to za M(VC)
.
Kontroler jest mechanizmem wejściowym interfejsu użytkownika, który jest często zaplątany w widoku, szczególnie w GUI. Niemniej jednak widok jest generowany, a kontroler jest wprowadzany. Widok często może działać bez odpowiedniego kontrolera, ale kontroler jest zwykle znacznie mniej przydatny bez widoku. Przyjazne dla użytkownika kontrolery wykorzystują ten widok do interpretacji danych wejściowych użytkownika w bardziej sensowny i intuicyjny sposób. Właśnie to utrudnia oddzielenie koncepcji kontrolera od widoku.
Pomyśl o sterowanym radiowo robocie na polu wykrywania w zapieczętowanym pudełku jako modelu.
Model opiera się na stanach i przejściach stanu bez koncepcji wyjścia (wyświetlania) lub tego, co wyzwala przejścia stanu. Mogę ustalić pozycję robota na polu, a robot wie, jak zmienić pozycję (zrób krok do przodu / do tyłu / w lewo / w prawo. Łatwy do wyobrażenia bez widoku lub kontrolera, ale nie robi nic użytecznego
Pomyśl o widoku bez kontrolera, np. Ktoś w innym pokoju w sieci w innym pokoju, obserwujący pozycję robota, gdy (x, y) koordynuje spływanie po przewijanej konsoli. Ten widok pokazuje tylko stan modelu, ale ten facet nie ma kontrolera. Ponownie łatwo wyobrazić sobie ten widok bez kontrolera.
Pomyśl o kontrolerze bez widoku, np. Ktoś zamknięty w szafie z kontrolerem radiowym dostrojonym do częstotliwości robota. Ten kontroler wysyła dane wejściowe i powoduje zmiany stanu bez pojęcia o tym, co robią z modelem (jeśli w ogóle). Łatwy do wyobrażenia, ale niezbyt przydatny bez jakiejś informacji zwrotnej z widoku.
Najbardziej przyjazny interfejs użytkownika koordynuje widok ze sterownikiem, zapewniając bardziej intuicyjny interfejs użytkownika. Wyobraź sobie na przykład widok / kontroler z ekranem dotykowym pokazującym aktualną pozycję robota w 2D i pozwalającą użytkownikowi dotknąć punktu na ekranie, który akurat znajduje się przed robotem. Kontroler potrzebuje szczegółowych informacji na temat widoku, np. Pozycji i skali rzutni oraz pozycji piksela dotkniętego punktu względem pozycji piksela robota na ekranie), aby poprawnie zinterpretować to (w przeciwieństwie do faceta zamkniętego w szafie z kontroler radiowy).
Czy odpowiedziałem już na twoje pytanie? :-)
Kontroler to wszystko, co pobiera dane wejściowe od użytkownika, które są używane do spowodowania przejścia modelu w stan przejściowy. Staraj się trzymać widok i kontroler oddzielnie, ale zdaj sobie sprawę, że często są od siebie zależne, więc dobrze jest, jeśli granica między nimi jest rozmyta, tj. Posiadanie widoku i kontrolera jako oddzielnych pakietów może nie być tak dokładnie oddzielone jak ty ale to jest w porządku. Być może będziesz musiał zaakceptować, że kontroler nie zostanie całkowicie oddzielony od widoku, ponieważ widok pochodzi z modelu.
... czy należy przeprowadzić weryfikację itp. w kontrolerze? Jeśli tak, to w jaki sposób mam przesyłać komunikaty o błędach z powrotem do Widoku - czy powinno to przejść ponownie przez Model, czy też sterownik powinien po prostu wysłać go z powrotem do Widoku?
Jeśli sprawdzanie poprawności odbywa się w widoku, co mam umieścić w kontrolerze?
Mówię, że połączony widok i kontroler powinny swobodnie współdziałać bez przechodzenia przez model. Kontroler przyjmuje dane użytkownika i powinien dokonać walidacji (być może przy użyciu informacji z modelu i / lub widoku), ale jeśli weryfikacja się nie powiedzie, kontroler powinien być w stanie bezpośrednio zaktualizować swój powiązany widok (np. Komunikat o błędzie).
Test kwasowy polega na zadaniu sobie pytania, czy niezależny widok (tj. Facet w drugim pokoju obserwujący pozycję robota przez sieć) powinien coś zobaczyć, czy nie, w wyniku błędu sprawdzania poprawności innej osoby (np. Facet w szafie próbował powiedzieć robotowi, żeby zszedł z pola). Zasadniczo odpowiedź brzmi „nie” - błąd weryfikacji uniemożliwił zmianę stanu. Jeśli nie było tranzytu stanu (robot się nie poruszył), nie ma potrzeby mówić innym poglądom. Facet w szafie po prostu nie otrzymał opinii, że próbował spowodować nielegalne przejście (brak widoku - zły interfejs użytkownika) i nikt inny nie musi o tym wiedzieć.
Jeśli facet z ekranem dotykowym próbował wysłać robota poza pole, otrzymał miłą, przyjazną dla użytkownika wiadomość z prośbą, aby nie zabił robota, wysyłając go poza pole wykrywania, ale nikt inny nie musi tego wiedzieć.
Jeśli inne poglądy nie muszą wiedzieć o tych błędów, to są skutecznie mówiąc, że nakłady ze strony użytkownika oraz wszelkie powstałe błędy są częścią modelu i cała sprawa jest trochę bardziej skomplikowane ...