9

Mam pytania dotyczące wzorca projektowego widoku modelu. Rozumiem, że model zawiera dane. Rozumiem również, że kontroler (kontrolery widoku) implementuje logikę aplikacji. Na przykład, jeśli kółko UIPicker wybierze wiersz 4, kontroler widoku może poprosić Model o czwarty obiekt przechowywany w tablicy Modelu. Mam problemy ze zrozumieniem, gdy pasują do nich "Widoki". Sądzę, że ten plik ze stalówką/scenorem zostałby sklasyfikowany jako "Widok". Jednak każdy widok wymaga podłączenia kontrolera widoku w celu podłączenia wszystkich gniazd do widoku. Jak mam zachować separację widoku i kontrolera widoku? Czy powinienem podłączyć wszystkie gniazda do "View Class", a następnie w moim kontrolerze View, odwołując się do mojej klasy "View" podczas implementacji logiki tych punktów? Może po prostu potrzebuję przykładu gdzie View i kontroler widoku obsługują różne zadania. W przeciwnym razie dodatkowa klasa "Widok" nie wydaje się mieć sensu. Czy widok MVC odnosi się do klasy widoku? Jak lub dlaczego chciałbym, aby ta klasa widoku była oddzielona od mojej klasy kontrolera widoku?Wzór projektu MVC. Jak View to pasuje?

Odpowiedz

14

Zadaniem widoku jest wyświetlanie danych i raportowanie zdarzeń.

Zadaniem sterownika jest koordynacja komunikacji między widokami a modelami.

Zadaniem danych jest przechowywanie danych, a także zapewnienie logiki biznesowej wokół tych danych.

Pytałeś:

mam problemy ze zrozumieniem były „Widoki” pasować

w twojej przykład UIPickerView jest widok..

W systemie iOS/OSX kontroler widoku to tylko kontroler MVC. Tak się składa, że ​​kontroler widoku zawiera również pusty kontener widoku, do którego można dodać wszystkie inne widoki. Ale wciąż istnieje wyraźne oddzielenie MVC w systemie iOS/OSX.

Wszystkie klasy, takie jak UIButton, UIPickerView, UITableView itd. Reprezentują widok. Zadaniem kontrolera widoku jest dostarczanie tych widoków danych z modeli danych, a także reagowanie na zdarzenia z tych widoków, co daje szansę na aktualizację innych widoków i modeli danych.

Ty stwierdził również:

Jednak każdy widok wymaga, aby View Controller być podłączony do drut aż wszystkie wyloty do widoku. Jak mam zachować separację widoku i kontrolera widoku?

Są oddzielne. Jeśli dodasz UITableView, będzie to osobny widok. Połącz go z klasą, aby klasa mogła implementować źródło danych i delegować metody. Ta klasa jest klasą kontrolera. Często ta klasa kontrolerów jest kontrolerem widoku, ale nie musi. Można pisać wszystkie niestandardowe klasy widoku, które są niezależne od dowolnego kontrolera widoku (lub ogólnego kontrolera). Ale ostatecznie ta klasa widoku musi zostać podłączona do klasy kontrolera [view], aby dane i zdarzenia mogły być poprawnie przetwarzane.

Pytałeś:

Jak i dlaczego miałbym chcieć mieć ten pogląd klasy oddzielony od moim zdaniem klasa kontrolera?

Spójrz na UITableViewController. Jest to wyraźny przykład oddzielenia, ale jest dostarczany w dość zgrabnym opakowaniu. Właściwie masz oddzielną klasę UITableView, która jest widokiem. Ten widok jest odpowiedzialny za renderowanie widoku i zbieranie interakcji użytkownika. Jest to rzeczywisty kontroler widoku tabeli, który dostarcza dane do widoku i obsługuje zdarzenia użytkownika z widoku. Możesz dodać widoki UITableView do dowolnego widoku Jest to komponent widoku do wielokrotnego użytku. Każdy kontroler podłączony do widoku tabeli może dostarczać dowolne odpowiednie dane i odpowiednio obsługiwać interakcje użytkownika.

+1

Wow, dziękuję za dokładną odpowiedź! Czuję, że jest to najbardziej szczegółowa odpowiedź na system iOS, która jest odpowiedzią na źródło mojego pytania. Mówisz, że kontroler widoku to obiekty kontrolera (a nie mieszanka kontrolerów i obiektów widoków). Mówisz, że widoki są hierarchią obiektów na pustym widoku, który jest dołączony do pliku storyboard/xib. Myślę, że myślałem, że obiekt "Widok" nie istnieje, jeśli nie ma dla niego oddzielnej oddzielnej klasy. Wiele razy zdarza się, że obiekt "Widok" nie wymaga oddzielnej klasy. Jednak niektóre widoki (takie jak widoki tabel) wymagają klas widoku (takich jak widok komórki tabeli). – iOSAppGuy

+0

Każdy widget, który przeciągniesz na scenorys lub kontroler widoku, jest oddzielną klasą widoku. Jest to o wiele bardziej oczywiste, gdy robisz wszystko w kodzie. – rmaddy

+0

dzięki! Ta odpowiedź z pewnością dostaje znacznik wyboru. To znacznie przyspiesza. Brak szacunku dla innych osób, które odpowiedziały, ale myślę, że powinienem był stwierdzić, że pracuję w Xcode dla rozwoju iOS. Byłem zaskoczony, że kontroler widoku terminów był dla niektórych tajemnicą - ale myślę, że MVC dotyczy różnych języków, które nie używają obiektów kontrolerów widoku. – iOSAppGuy

1

Dobra, postaram się trochę uporządkować.

Wzór nosi nazwę Sterownik widoku modelu, dzięki czemu wyraźnie oddziela model, widok i kontroler. Jak słusznie zauważyłeś, ViewController układa wszystko razem (z widoku i kontrolera :) i faktycznie ViewController łamie silny wzorzec MVC. Dobrą wiadomością jest to, że nie musisz oddzielać widoku od kontrolera, jeśli korzystasz z ViewController (zgadnij, dlaczego tak się nazywa?).

Teraz moja Nooby wyjaśnienie dlaczego projekt jest, co to jest:

Kiedy mocno oddzielić View i Controller w zasadzie zdobyć punkty kredytowe dla dobrego projektu. Jednak, jak się okazuje, nie są one tak rozdzielone, jak byśmy chcieli. Różne reprezentacje GUI zwykle wymagają innej implementacji widoku, jak również adaptacji kontrolera, który steruje przekazywaniem Modelu do GUI, np. wyświetlanie zwykłego tekstu na konsoli i rysowanie na mapie bitowej. W pierwszym przypadku kontroler przekazałby ciąg znaków do renderowanego widoku, w drugim zaś musiałby ustawić pewne współrzędne, aby tekst był renderowany we właściwe miejsce. W związku z tym twój kontroler będzie się często zmieniać.

Idealnym rozwiązaniem byłoby zaimplementowanie modelu i kontrolera, a po prostu udostępnienie widoków dla wszystkiego, co ktokolwiek może zobaczyć w rzeczywistości. Jednak w rzeczywistych sytuacjach kontroler najprawdopodobniej dostosuje się do widoku, pozostawiając sam model. Dlatego decyzja projektowa, aby połączyć widok i kontroler z ViewControllerem, który zawiera określony widok i wie, jak go używać, jest rozsądnym rozwiązaniem.

+1

-1 Nie ma "viewcontroller" w wzorcu projektowym MVC –

+0

dzięki. Jeśli dobrze to rozumiem, podczas pracy z kontrolerami View najprawdopodobniej będę pracował z wzorcem Model - ViewController zamiast wzorca M-V-C. To może być dobre lub może być złe w zależności od złożoności mojej aplikacji. Być może, jeśli chciałbym pójść z wzorcem M-V-C, podczas przeciągania obiektu ViewController na mój scenopis, zamiast tego zmieniłbym jego klasę na niestandardową klasę widoku. Zrobię kolejną klasę dla mojego modelu i kolejną klasę dla kontrolera. Pozwoli to zachować porządek i nie będę miał ochoty zabrudzić mojego wzoru za pomocą kontrolera ViewController. – iOSAppGuy

+1

@ tereško no nie ma. Jednakże, jak pierwotne pytanie sugeruje, że tematem jest iOS/OSX Development (czyli skąd pochodzą kontrolery ViewControllers) i właśnie próbowałem wyjaśnić, dlaczego projektanci wybrali tę koncepcję podczas propagowania MVC. –

0

Cóż, aby odpowiedzieć na twoje pytanie zepsujmy MVC - Model, Widok, Kontroler. Co jest gdzie?

Typ Model jest zwykle uważany za warstwę "zrób coś". To zawiera logikę biznesową i logikę danych. Twój model powinien być FAT, a nie SKINNY, co oznacza, że ​​powinieneś mieć dużo swojego kodu w Modelu.

Sterownik Sterownik, uważam za warstwę "odpowiedzi". Tutaj decydujesz, co powrócić do użytkownika, niezależnie od tego, czy jest to Widok, czy inny rodzaj odpowiedzi, na przykład JSON (szczególnie przydatny w odpowiedziach RESTful). Możesz również użyć modelu, ale nie powinieneś budować zbyt dużej logiki w samym kontrolerze. Powinieneś mieć kontroler SKINNY.

Znaczek ten jest w dużej mierze znacznikiem strony - kod HTML oraz inne znaczniki umożliwiające uzyskanie dostępu do modelu - zależy to od używanej struktury. Moje doświadczenie jest z MVC .NET, więc pójdę z tym.Zmieszany z kodem HTML uzyskujesz dostęp do elementów modelu. Nie powinno być żadnych realnych logika w widoku, ale można zrobić rzeczy jak (z użyciem składni Razor)

<div>@foreach person in Model.Users{ 
    <p>@person.FullName</p> 
} 
</div> 

Więc widać, że widok może mieć jakąś „logikę wyświetlania” (jak, pętlę nad ludźmi i zdobądź FullName), ale to wszystko, co naprawdę powinno tam być.

Oto krótki pokaz slajdów, który tłumaczy się więcej o MVC, w tym dlaczego początkowe wyjaśnienie „model posiada dane, Kontroler posiada logikę” w rzeczywistości nie jest prawdą: http://www.slideshare.net/damiansromek/thin-controllers-fat-models-proper-code-structure-for-mvc

MVC Pattern Design nie obejmuje wszystko, co nazywa się "ViewController", pochodzi z innego miejsca.

+0

James - Buduję aplikacje na iOS w Objective C, używając Xcode. Podczas budowania widoków graficznie używane obiekty są nazywane kontrolerami widoku. Istnieją również kontrolery widoku tabeli itp. Podczas uruchamiania projektu prezentowany był kontroler widoku pustego i klasa kontrolera widoku. Wszyscy uczą budowania iOS za pomocą kontrolerów widoku. Ci ludzie również głoszą o M-V-C. Podczas demonstrowania aplikacji do budowania, rzeczy mieszają się z kontrolerami widoku. – iOSAppGuy

+0

Po krótkim przeglądzie, wygląda na to, że ViewControllery to rodzaj "rozszerzonych kontrolerów", którymi można zarządzać wieloma Widokami. Muszę zaznaczyć, że nadal NIE jest to częścią tradycyjnego modelu MVC, o czym pisałem powyżej, jest to coś innego. MVC oznacza wiele rzeczy dla wielu ludzi, ale to, co wytłumaczyłem, było standardem. –

1

W rzeczywistości to, co rozumiesz, jest całkowicie błędne.

Podstawową zasadą wzornictwa MVC jest Separation of Concerns. Oddzielasz warstwę modelu od warstwy prezentacji i (w warstwie prezentacji) oddzielasz widoki od kontrolera.

Każdy tam pars mają różną odpowiedzialność:

  • modelu warstwa zawiera wszystkie logiki biznesowej. Dotyczy to interakcji z pamięcią masową, logiką domeny i logiką aplikacji.
  • Widok odpowiada za logikę interfejsu użytkownika. W kontekście sieci oznacza to, że widok zajmuje się tworzeniem odpowiedzi dla użytkownika, który jest elementem, który pobiera dane wejściowe użytkownika i na tej podstawie zmienia stan warstwy modelu i bieżącego widoku.

Istnieje wiele nieporozumieniem o MVC, że ludzie mają tendencję do utrwalenia. Na przykład:

  1. Niektórzy będą nalegać, że poglądy są głupie szablonów. Oni nie są.

    Widoki we wzorcu projektu MVC są w pełni funkcjonalną instancją, która może lub nie może używać wielu szablonów do generowania odpowiedzi.

  2. Nie ma "modeli". Model to warstwa, która składa się z wielu różnych grup klas, z których każda ma określone zadanie. Tak samo jak nie ma obiektów "prezentacji" dla warstwy prezentacji. Kontrolery nie wysyłają danych z warstwy modelu do widoków. Kontroler zmienia tylko stan innych części triady. Instancje widoku same żądają tego, czego potrzebują od warstwy modelu.

+1

Należy pamiętać, że pytanie nie dotyczy wyłącznie wzoru MVC. Chodzi o zastosowanie wzorca MVC w kontekście świata rzeczywistego (a mianowicie iOS - przeczytaj tekst!). Może być oznaczony nieprawidłowo, ale używaj zdrowego rozsądku. –