2013-03-16 12 views
7

Tworzę aplikacje na iOS od kiedy pamiętam, ale do niedawna nie rozwinąłem swojego stylu programowania, kiedy dostałem program praktyk. Wiele wcześniej poznałem koncepcje OO, ponieważ zdałem sobie sprawę z tego, że życie jest wyssane bez ich zrozumienia, ale jedną rzeczą, której nigdy się nie nauczyłem, był wzorzec MVC.Co powinno być własnością modelu we wzorcu MVC?

Aby podać kontekst, załóżmy, że rysuję układ słoneczny wewnątrz pojedynczej SolarSystemView (podklasy UIView). Czy moja SolarSystemView powinna mieć zmienną instancji klasy SolarSystem (klasa zawierająca strukturę danych ze wszystkimi ważnymi właściwościami planetarnymi i stelarnymi), czy też powinna być własnością instancji SolarSystemViewController? Czy jest to coś zupełnie innego? Nie mogę znaleźć żadnego przykładowego kodu, który daje zadowalającą odpowiedź.

Wyobrażam sobie, że gdyby widok posiadał model, operacje byłyby bardzo płynne, ale to również nie wygląda na dobry styl. Wszakże instancja SolarSystem musi się jakoś dynamicznie zmieniać iz tą samą lub podobną szybkością, którą aktualizuje SolarSystemView.

Odpowiedz

5

W paradygmacie MVC model powinien być oddzielony od widoku. Aby uzyskać dane, które musi narysować, prosi o to Kontrolera, który z kolei prosi Model o to. W ten sposób odejmujemy informacje od GUI. Pomyśl o tym jako o widoku kontrolera modelu, jeśli to pomaga. Dlatego w większości przypadków kontroler "jest właścicielem" modelu.

Na przykład w cs193p, CalculatorViewController (kontroler) ma właściwość CalculatorBrain (model), z którą wchodzi w interakcję, aby uzyskać wyniki równań do wyświetlenia w widoku.

W danym przykładzie SolarSystemViewController prawdopodobnie mają silne odniesienie do SolarSystem, co byłoby ankietę dla danych, które byłoby rękę z The SolarSystemView tak, że może zwrócić się, gdy wymagał odnowienia. SolarSystemView może również powiadomić SolarSystemViewController, gdy użytkownik wejdzie z nim w interakcję, aby mógł wyświetlać inne widoki lub aktualizować SolarSystem wśród innych zadań, które może wykonać.

Należy zauważyć, że paradygmat MVC w Cocoa i Cocoa Touch jest nieco inny niż bardziej uogólniona wersja MVC, którą można zobaczyć, np. Smalltalk. Na przykład, jeśli spojrzysz na Wikipedia page on MVC, diagram powinien wyglądać inaczej niż to, czego się uczyłeś. W rzeczywistości GoF (Wzorce projektowe) opisuje w ten sposób MVC.

MVC składa się z trzech rodzajów obiektów. Model jest obiektem aplikacji, widok jest jego ekranem, a kontroler definiuje sposób, w jaki interfejs użytkownika reaguje na dane wprowadzone przez użytkownika. Przed projektami interfejsu użytkownika MVC, miały tendencję do scalania tych obiektów razem. MVC oddziela je, aby zwiększyć elastyczność i użyć ponownie. MVC oddziela widoki i modele poprzez ustanowienie między nimi protokołu subskrypcji/powiadamiania. Widok musi zapewniać, że jego wygląd odzwierciedla stan modelu. Kiedy zmieniają się dane modelu, model powiadamia o widokach, które zależą od niego. W odpowiedzi każdy widok otrzymuje możliwość aktualizacji samego siebie. To podejście umożliwia dołączanie wielu widoków do modelu, aby uzyskać różne prezentacje. Możesz również utworzyć nowe widoki modelu bez przepisywania go.

W obu tych przypadkach sam model kontaktuje się z widokiem, aby go zaktualizować. Jednak w systemie iOS interakcja między modelem a widokiem jest obsługiwana przez kontroler. Jest to dobrze wyjaśnione w first session of cs193p, a także Apple's own documentation on MVC relationships.. W ten sposób wystarczy przepisać kod kontrolera, aby ponownie użyć modeli i widoków w innym miejscu.

Oto schemat MVC z cs193p, aby wyjaśnić.

Model View Controller

+0

To pokrywa całkowicie to, o co prosiłem; Mam jedno dodatkowe zapytanie. Co powinien zrobić "tick" -ing? Musiałby oczywiście być kleszczem, aby planety mogły się poruszać. Jeśli rozumiem poprawnie, to kontroler będzie właścicielem zegara, w którym to momencie będzie wymagał zmiany modelu, a następnie pobierania danych z modelu i wyświetlania go na ekranie, prawda? Może to być satysfakcjonujące dla osobnego pytania. –

+0

@CarterPape Tak, to brzmi dla mnie poprawnie. Kontroler zwykle obsługuje aktualizacje modelu, a następnie powiadamia o widokach, które wymagają aktualizacji. Na przykład, pętla uruchamiania gry istniałaby w kontrolerze, a każda klatka powiadomiłaby agentów w grze (model), aby aktualizowali się przed powiadomieniem o widoku (takim jak GLKView), aby zaktualizować się. – Metabble

0

W tym przypadku SolarSystemView nie powinny zawierać żadnych chwilę klasy SolarSystem. SolarSystemViewController powinien być przejściem między twoim widokiem (SolarSystemView) a modelem (SolarSystem).

Powiązane problemy