MVC в приложении на основе документов Какао

В данный момент я прохожу рефакторинг и реорганизацию своего приложения. Я понял, что некоторое разделение между моделями и представлениями, а также их контроллерами уменьшилось, и я хочу кое-что очистить.

В моем приложении используется несколько ключевых классов: NSPersistentDocument, NSWindowController и класс модели.

Класс NSPersistentDocument действует как «модель-контроллер»; он владеет экземпляром класса модели и управляет всеми взаимодействиями с моделью.

Класс NSWindowController действует как «контроллер представления»; он владеет главным окном и управляет взаимодействием представлений в главном окне. Этот класс также является владельцем файла для файла пера, в котором определено окно.

Проблема, которую я вижу здесь, в том, что у меня нет настоящего «контроллера». Мой текущий дизайн заставляет контроллер модели и контроллер представления знать друг о друге. Между ними нет объекта для медитации, и из-за этого моя модель и представление не разделены четко, что делает поддержку нескольких представлений или моделей проблемой.

Я хотел бы переместить функциональные возможности обоих моих существующих контроллеров в новый класс «контроллера», который будет действовать как контроллер между контроллером модели и контроллером представления. В конце концов, это все еще шаблон проектирования MVC с немного большей структурой.

Однако мне трудно понять, как это вписывается в архитектуру приложений Cocoa, основанную на документах.

Самый большой вопрос, который у меня есть, - где и как будет создан этот новый объект контроллера? Как это вписывается в архитектуру Какао? Я борюсь против архитектуры Какао, и есть ли лучший способ сделать это?

Спасибо.


person CJ.    schedule 16.02.2010    source источник


Ответы (2)


Отличные инстинкты наличия «контроллера модели» и «контроллера представления». Это очень хорошая ментальная систематика того, как обычно сочетаются буквы M и V. Но вы все еще можете использовать чистый «C» в MVC, чтобы связать всю операцию вместе, как вы заметили.

Если вы говорите об одном контроллере для приложения: думайте о контроллере (big-C) как о том, что происходит из функции main () вашего приложения - в старых руководствах по Cocoa этот объект часто называют AppController. Это может быть делегат UIApplication или нет, но если это не так, вам следует подумать о создании такого главного контроллера в методе applicationDidFinishLaunching: делегата приложения в вашем проекте. Затем этот AppController может настраивать (и владеть) объектами модели и настраивать (и владеть) корневой контроллер представления, из которого исходит ваш пользовательский интерфейс.

Если вы говорите о каком-то посредническом компоненте, у которого есть несколько экземпляров, по одному для каждой «пары» модель / представление в архитектуре документа, тогда просто создайте что-нибудь подобное. DocumentController - это то имя, которое вам нужно, хотя у Cocoa уже есть одно из тех, которые могут отражать, а могут и не отражать нужную вам функциональность. «DocumentManager» - другое имя кандидата.

person Ben Zotto    schedule 24.02.2010

Похоже, вам нужно взять копию Шаблоны проектирования какао, отвечает на эти и некоторые другие вопросы.

В главе 2 рассматривается шаблон MVC с использованием ArrayController в качестве контроллера модели (а не постоянного контроллера модели документа, который вы используете).

person pokstad    schedule 16.02.2010