В MVC, где вы помещаете ссылки на свои классы классов?
Некоторое время я задавался вопросом, спрашивая разных людей и без каких-либо из них предоставляя то, что я бы назвал "по крайней мере немного конкретным ответом":
Вопрос:
Где в приложении iPhone приложение должно содержать ссылки на него. Классы моделей (используя метод MVC)?
В приложениях iPhone (и Cocoa) мы имеем то, что мы называем "делегатом приложения", который в основном запускает наше приложение и использует наши контроллеры, также обрабатывает события UITouch.
Итак, делегат приложения является контроллером? модельный класс? ни один из двух? Я думаю, что не зная, что также заставляет сбивать с толку знать, куда помещать ссылки на модели.
Пример:
У вас есть делегат приложения, делегат содержит ссылку на ваш контроллер представления приложений. Если в моем приложении будет использоваться класс модели A (который является классом демона веб-сервера) и класс B, который хранит данные, запрошенные этим веб-сервером.
Где бы вы, ребята, хранили ссылки на A и B? (Диспетчер приложений? Просмотр контроллера?)?
Здесь есть много вариантов, но в качестве примера я бы очень хотел узнать, как вы, ребята, используете mvc, чтобы собрать это приложение, которое использует только один вид.
Ответы
Ответ 1
Заманчиво поместить все в AppDelegate, но если вы начнете это делать, то ваш AppDelegate будет заполнен ссылочными хаками. Если вы выполняете строгий MVC, то у вас должно быть 3 вещи:
- Модель
- Контроллер просмотра (только для логики просмотра)
- A Контроллер (для координации между представлением и моделью)
Так, например, у меня есть модель Foo и контроллер Foo. Я бы:
- Foo.m(Модель)
- FooViewController.m(отображает Foo)
- FooController.m(управляет логикой)
И, наконец, чтобы ответить на ваш вопрос, я бы сохранил свои ссылки на Foo в foo Controller. Мне нравится использовать синглтоны для моих контроллеров, но это только я. Если вы используете синглтон, вы можете просто сделать что-то вроде этого: [[FooController sharedInstance] listOfFoos]
, чтобы получить
Foo
Ответ 2
В моих приложениях я обычно переименовываю класс AppDelegate в AppController, если это помогает лучше понять концепцию. Контроллер вашего приложения отвечает за создание и/или настройку контроллера модели (который управляет вашей коллекцией объектов модели) и контроллеров окон или представлений, при необходимости настраивая ссылки между ними, а также методы вызова на этих контроллерах в ответ на методы делегирования NSApplication или методы высокого уровня действий из главного меню. В зависимости от того, насколько сложным является ваше приложение, вы также можете иметь дополнительные модели или контроллеры представлений, созданные за пределами вашего контроллера приложения.
Конечно, если у вас есть простое приложение, нет реальной причины, чтобы ваш контроллер приложений не играл роль контроллера модели, если вы хотите. То, что вы хотите избежать, это файл с сотнями строк кода, который выполняет концептуально несвязанные задачи.
Ответ 3
Традиционно контроллер создает модель, а затем инициализирует представление с этой моделью. Затем контроллер прослушивает изменения в модели и просматривает и координирует поток программы через это. Это будет мой общий ответ, возможно, на практике все будет по-другому для развития iPhone.
Ответ 4
Где в приложении iPhone приложение должно содержать ссылки на него. Классы моделей (с использованием подхода MVC)?
Уровень контроллера поддерживает ссылки на слой модели.
Итак, делегат приложения является контроллером? модельный класс? ни один из двух?
Делегат приложения - это контроллер.
Где бы вы, ребята, хранили ссылки на A и B?
A и B - это классы моделей, которые обычно создаются и принадлежат уровню контроллера.
Мне бы очень хотелось узнать, как вы, ребята, используете mvc, чтобы собрать это приложение, которое использует только один вид.
Цель слоя контроллера - позволить автономной модели и уровням просмотра. Модель не должна знать ничего о контроллере или уровнях просмотра. Представление не должно знать ничего о контроллере или слоях модели. Задача контроллера должна быть двухсторонним адаптером для модели с одной стороны, а вид - с другой.
Я бы установил пример вашего приложения следующим образом:
- делегаты UIApplication в AppDelegate.
- Если операция вашего класса сервера (A) проста:
- AppDelegate создает и владеет экземплярами класса сервера A.
- Если операция вашего класса сервера (A) сложна:
- Создайте выделенный класс контроллера (C) для управления сервером.
- AppDelegate создает и владеет экземплярами класса C. Один экземпляр (C) для каждого экземпляра (A).
- Каждый экземпляр класса C создает и имеет один экземпляр класса A.
- AppDelegate создает и владеет экземпляром вашего класса ViewController, который загружает и владеет вашим представлением.
В вопросе непонятно, какова цель класса B.
- Если это кусок данных, который для использования только A (например, данные конфигурации или статические данные веб-сайта), я бы создал его и принадлежал серверу (A).
- Если это данные, которые создаются во время работы сервера и должны отображаться в представлении, тогда вы, вероятно, захотите что-то вроде:
- Изменчивый массив, принадлежащий A, для хранения экземпляров B.
- Другой класс контроллера (D) ссылается на этот массив и выступает в качестве источника данных/делегата для вашего представления.
Ответ 5
Я нахожу, что в большинстве случаев AppDelegate предоставляет хорошее место для размещения некоторых базовых функций (таких как фоновое изображение, которое вы хотите применить в каждом контроллере), но что вы захотите иметь дополнительные контроллеры и код модели в другом месте. NavController или rootController часто помещались как свойство в AppDelegate.
Итак, я бы сказал, что это где-то между "ни" и "контроллером", но больше склоняется к "ни одному". Определенно не "модель"!