2011-05-03 9 views
8

Czytam na MVVM i przez całe życie nie mogę powiedzieć, jak "widok modelu" MVVM radykalnie różni się od "kontrolera" w MVC, jak używane w programowaniu Cocoa.W jaki sposób MVVM w .Net różni się od MVC w kakao?

Przeczytałem nawet kilka wyjaśnień, które były rzekomo "aha" dla innych osób i nadal nie udało im się złapać różnicy. Ograniczone programowanie GUOA w Cocoa wymagało obsługi kontrolera jako centralnego punktu zarządzania danymi przechodzącymi do ORAZ z widoku do modelu za pomocą obserwacji klucz-wartość.

We wszystkich ważnych aspektach wydaje mi się, co robi "widok modelu", z wyjątkiem tego, że może to być subtelna różnica w implementacji odnosząca się do WPF < -> Mostek C# w .Net. Oznacza to, że MVC w Cocoa może być nazywane MVVM, jeśli GUI Cocoa zostało określone w innym języku niż kod aplikacji, a kontroler został zakodowany w tym samym języku co GUI zamiast aplikacji (tj. WPF jest określony w XAML zamiast DO#).

A może MVC w środowiskach bez kakao, bez obserwacji wszystkich wartości kluczowych itp. Jest znacznie inny niż MVC stosowany w Kakao i to doprowadziło ludzi do znalezienia większych różnic między MVVM i MVC niż ja.

Czy jestem szalony? Proszę, naucz mnie.

+0

Przeczytaj, jak możesz akceptować odpowiedzi: http://www.stackoverflow.com/faq#howtoask. Jeśli nie masz odpowiednich odpowiedzi, edytuj swoje pytania i dodaj więcej informacji. – jgauffin

+0

możliwy duplikat: http: // stackoverflow.com/questions/667781/what-is-the-the-difference-between-mvc-and-mvvm – Arjang

+2

Przeczytałem ten wątek. Nie sądzę, że jest to duplikat, ponieważ gdy odnosi się do "wspólnego wzorca MVC", nie jestem pewien, czy to odnosi się do MVC zaimplementowanego w Cocoa + Obj-C. Trochę więcej badań, wydaje się, że MVC firmy Apple jest bardziej podobny do MVP, a MVVM to subtelny zwrot na MVP, który odnosi się do projektowania GUI w języku specyficznym dla GUI ... – Cyclone

Odpowiedz

13

Byłem wielkim fanem MVVM w WPF od lat, a ostatnio podjąłem MVC w Cocoa. Z początku wydawali się identyczni, a potem podobni, a teraz, gdy pracuję bardziej z Kakao, nic podobnego.

Mam wrażenie, że różnice są zgodne z kierunkiem wiązania.

W MVVM widok wiąże właściwości z obiektem ViewModel (V -> VM). Zmień właściwości obiektu ViewModel, a przy użyciu opcji NotifyPropertyChanged przy użyciu jiggery-pokera widok automatycznie aktualizuje się. Widok biernie odczytuje właściwości obiektu View Model, a ViewModel nie wie o widoku absolutnie nic - można usunąć widok i nadal będzie działał. Daje to elastyczność do przepisywania, zmiany lub łączenia widoków i sprawia, że ​​"po prostu działają" bez zmiany kodu modelu widoku linii.

W MVC pod kakao (iOS) kontroler widoku wiąże się z widokiem (VC -> V) poprzez jawne właściwości IBAction/IBOutlet - masz bezpośrednie odniesienie w swoim kontrolerze widoku do obiektów widoku. Bezpośrednio powiedzieć kontroli na widoku, aby zmienić w kontroler widoku, a ViewController ma intymną wiedzę na temat wewnętrznych w widoku. Usuń widok, a ViewController wyrzuci wyjątki czasu wykonywania.

Dla mnie chodzi o kierunek wiązania.

Z kakao za pomocą wzorca MVC, bezpośrednio "kontrolujesz" widok za pomocą kontrolera widoku (co do rozsądku, prawda?).

W MVVM/WPF użytkownik otrzymuje aktualizację kontroli widoku, obserwując zmiany w obiekcie ViewModel - wiązanie jest odwrotne i pasywne.

WPF bez MVVM jest jak Cocoa MVC dla iOS i przypomina trochę formularze ASP.NET.

Kakao dla OSX ma bardziej dostępną strategię wiązania MVVM, ale nie jest dostępne w systemie iOS.

+3

To wydaje się pasować do tego, co odkryłem. Pierwotnie zadałem pytanie, kiedy po raz pierwszy znalazłem framework Knockout.js dla aplikacji internetowych MVVM. Problem, który odnalazłem w MVVM, polega na tym, że kierunek wiązania zachęca do małych fragmentów kodu w widoku lub do zewnętrznych właściwości ViewModel w celu uproszczenia wiązania. W końcu często kończę używać MVC, ponieważ uważam, że można powiedzieć, że przy obserwowalnych wartościach, zarówno "magicznie" aktualizuje się interfejs użytkownika. Dla przypadku kontrolera widoku wyrzucanie wyjątków, gdy nie są związane ... czy nie byłoby po prostu ignorowane jako wysyłanie wiadomości do zera? – Cyclone

Powiązane problemy