Подтвердить что ты не робот

Шаблоны проектирования для фреймворков Apple Cocoa: MVC, MVP, Пассивный просмотр... где заголовок Apple?

Чтобы заложить основу для этого вопроса, я собираюсь заявить, что получаю мои определения для MVC, MVP и Passive View из следующего:

Model View Controller (MVC)
Model View Presenter (MVP)
Пассивный просмотр (PV)

Apple всегда заявляла, что использует шаблон проектирования MVC, но я заметил, что в OS X 10.5 мы получили NSViewController, KVO, привязки и т.д., объекты, которые, похоже, больше похожи на шаблон пассивного представления. Это где Apple хочет, чтобы мы возглавили? Я хочу планировать свой код так, как это возможно, с выбранными Apple шаблонами дизайна, поэтому я хочу знать, куда направляется Apple. Кто-нибудь знает?

4b9b3361

Ответ 1

Любой код любой сложности имеет много мест, где могут применяться разные шаблоны. MVC является видным в документах Cocoa, потому что он объясняет отношения между вашим функциональным кодом (моделью), вашим интерфейсом пользовательского интерфейса или дизайном IB (вид) и услугами Cocoa, которые связывают их вместе (контроллер). Это стоит упомянуть, особенно во вводной dox, потому что вам нужен небольшой "звонок для пробуждения", чтобы перестать думать, что вам нужно написать все это самостоятельно, и начать думать о том, как создавать свои уникальные части, и доверять структуре, чтобы сделать ее сантехника.

Вариантные определения MVC являются легендарными, и стоит отметить, что MVC не описывается в канонической книге "Банда четырех" "Шаблоны проектирования". Также стоит признать, что модель Cocoa "MVC" отличается от модели SmallTalk 80 MVC (откуда и возникла терминология).

Возможно, стоит также отметить, что "GoF" фактически использует слово "шаблон" для обозначения конкретного стиля документации, а не абстрактный способ проектирования кода, который описывает шаблон. Это слишком плохо, что это использование в значительной степени было потеряно. Если бы мы все поняли это слово, тогда я мог бы сказать: "Было бы действительно полезно, если бы кто-то действительно написал шаблон для Cocoa MVC". Тогда мы все не будем так смущены!

Ответ 2

Cocoa основан на MVC (как Apple определяет его), и всегда был тенденцией делать все больше и больше для вас. Вот как это сейчас.

  • Просмотр слоя: NSView, NSWindow, NSCell, их подклассы и CALayer
  • Уровень контроллера (с 10.3): NSController и подклассы (преимущественно NSArrayController)
  • Уровень модели: традиционно вам приходилось делать это полностью самостоятельно, но с 10.4 вы можете использовать Core Data.

Привязки питаются от KVO (и KVC) и являются клеем, который связывает три слоя вместе. Вы привязываете представления к контроллерам и контроллерам к модели.

Ответ 3

Я бы не сказал, что Cocoa следует пассивному шаблону представления, как там описано. Он говорит, что контроллер выполняет всю работу по подготовке представления и отправке уведомлений об изменениях. В Cocoa объект представления обычно будет отвечать на уведомления KVO (через привязки) из модели, обновлять данные от контроллера, к которому он привязан, подготовить его через форматирование данных или трансформаторы значений и, наконец, отобразить его на экране.

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

Из этого же руководства этот раздел объясняет некоторые дополнительные шаблоны проектирования, которые могут оказаться полезными. В моем собственном опыте, хотя после работы над несколькими проектами MVC в Cocoa имеет тенденцию появляться довольно естественно, я бы не стал слишком беспокоиться об этом.

Ответ 4

Я не думаю, что Cocoa/OpenStep когда-либо действительно следовал за MVC, как описано, например, SmallTalk 80. Контроллер SmallTalk действительно является тем, что отвечает за интерпретацию взаимодействия пользователя с представлением, которое в случае Cocoa обрабатывается NSControl и, следовательно, с помощью слоя "Вид" (возможно, оно разлагается таким образом внутри рамки, но мы не должен заглянуть внутрь, что абстракция все о:-). В отношении ваших ссылок слой Controller в Cocoa действительно попадает под баннер Presenter, особенно при рассмотрении различных классов NS * Controller из Cocoa Bindings. Это действительно шаттл между слоем представления и моделью.

В моих собственных приложениях я имею тенденцию иметь четыре разных слоя, даже в тех местах, где они явно не разделены; представление, презентатор, сервис и модель. Тогда "контроллеры презентаторов" и "сервисные контроллеры" имеют совершенно разные цели; логика и процессы находятся в сервисах, а рабочий процесс и варианты использования находятся в контроллерах представления. С точки зрения упаковки, если вы занимаетесь такими вещами, сервисы и модель вместе представляют собой абстрактные "вещи, которые нужно делать на материалах", которые могут быть не зависящими от контекста. Презентаторы и представления представляют собой "и это то, как пользователь приложения Mac OS X хотел бы использовать его", который зависит от более низкого пакета и инкапсулирует классы и поведение, специфичные для AppKit (и AHIG).

Ответ 5

Яблочные документы фактически объясняют MVC лучше всего, что я читал. В основном путаница, связанная с MVC, состоит в том, что она представляет собой сложную структуру. Он состоит из множества основных шаблонов. Хотя MVC не обсуждался в Design Pattern от Gang of four, основные шаблоны были.

Основное различие, на мой взгляд, заключается в том, что в в мире Apple Контроллер - это медиатора в дополнение к тому, что это нормально.

Таким образом, в отличие от традиционного подхода модели в мире Apple не сообщают мнения об изменениях. Они не уведомляют никто на самом деле. Если вы хотите изменить модель, которую вы должны сделать с помощью контроллера, чтобы убедиться, что все уведомлены об изменениях.

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

Это главным образом объекты контроллера, которые должны быть переписаны в этом подходе. Конечно, Apple изменила это с привязками. Но если вы не используете привязки, то контроллеры зависят от приложения.

Использование Apple MVC в С++

Я фактически следовал дизайну Apple при программировании приложений на С++ с использованием Qt. Представления - это QWidget. Я помещаю весь код, который связан с внешним видом в подклассе QWidget. Затем я делаю свой контроллер подклассом QObject и создаю объекты представления и подключаю сигналы от QWidgets к слотам в моем контроллере QObject. Мой класс модели - это обычный класс, который не наследует ничего из Qt и не реализует бизнес-логику. Он модифицируется слотами контроллеров.

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

Не уверен, что это кому-то помогает, но я думаю, что иногда легче воспринимать шаблоны Cocoa в терминах С++, потому что мы привыкли получать шаблон, объясненный с точки зрения статически типизированного языка, такого как С++ и Java.

Ответ 6

О-оу. MVC = самый ошибочный шаблон. Я прочитал как минимум 5 различных определений.

Вы можете прочитать эту статью Martin Fowler