MVC и вопрос наилучшей практики связывания какао

Допустим, у меня есть представление, myView, контроллер представления, myViewController и некоторый объект модели myModel. Далее, скажем, модель имеет два свойства, совместимых с KVO, arrayOfPeopleNamesи arrayOfAnimalKinds(обе строки NSStrings).

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

У меня вопрос, если myController имеет ссылку на myModel, а выпадающий список привязан к myViewController, является ли хорошей практикой установка ключевого пути вдоль строк myModel.arrayOfPeopleNames?

Или мне нужно настроить дополнительный массив NSArray в myViewController, который отражает тот, что в myModel, и вместо этого привязывается к этому ключевому пути?

Первый вариант выглядит намного проще с точки зрения реализации (мне не нужно заставлять массив контроллеров отражать массив моделей), но мне интересно узнать, насколько он предоставляет модель для представления.

Мнения?

10.12.2008 17:58:58
1 ОТВЕТ
РЕШЕНИЕ

Вы не должны отражать массив модели в контроллере. Хотя в очень простом случае меня не слишком беспокоит привязка напрямую к массиву модели, вы также можете привязать свои объекты пользовательского интерфейса к NSArrayController, который управляет массивом модели. Это обеспечит разделение между моделью и пользовательским интерфейсом и, что более важно, будет выполнять такие задачи, как сортировка, выбор, добавление и удаление объектов и так далее.

Я могу видеть, откуда вы, потому что обеспокоен KVO, и привязки нарушают «чистый» дизайн контроллера представления модели, но вам не о чем беспокоиться. Даже несмотря на то, что уведомления KVO передаются непосредственно в представление от модели, настройка и изменение соединения между представлением и моделью все еще является обязанностью контроллера (только в этом случае это делается через IB). Например, вы не хотели бы, чтобы объект модели получал ссылку на представление и связывал себя с пользовательским интерфейсом, это было бы ответственностью контроллера.

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

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

8
10.12.2008 18:18:19
Спасибо Марк, это имеет большой смысл. Я ценю все вопросы, ответы на которые вы мне давали в последнее время :).
Lawrence Johnston 10.12.2008 18:21:49