WedX - журнал о программировании и компьютерных науках

Шаблоны проектирования для фреймворков Apple Cocoa: MVC, MVP, Passive View Куда движется Apple?

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

Контроллер представления модели (MVC)
Презентатор представления модели (MVP)
Пассивный просмотр (PV)

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

09.12.2008

  • Похоже, что некоторые люди думают, что меня смущают термины MVC, MVP и PV; не волнуйся, я не! :) Я просто хочу знать, постепенно ли Apple переходит к шаблону проектирования PV, но без изменения названия с MVC на PV. Мне кажется, что они (старый код был MVC, новый - PV) 10.12.2008

Ответы:


1

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

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

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

10.12.2008

2

Cocoa основан на MVC (как Apple определяет это) и всегда стремится делать больше и многое другое для вас. Вот как обстоит дело в настоящее время.

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

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

09.12.2008

3

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

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

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

09.12.2008
  • Я ценю ссылки, но меня не смущают шаблоны; Я просто хотел посмотреть, переходит ли Apple к другому образцу. Новые фреймворки/шаблоны кажутся (мне) движущимися к пассивному взгляду, и я хотел проверить с другими, правда ли это. Спасибо хоть! 10.12.2008

  • 4

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

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

    09.12.2008

    5

    Apple docs на самом деле объясняет MVC лучше, чем что-либо еще, что я читал. В основном путаница, связанная с MVC, связана с тем, что это составной шаблон. Он состоит из множества основных шаблонов. Хотя MVC не обсуждался в Шаблоне проектирования Бандой четырех, основные шаблоны обсуждались.

    Основное отличие, я думаю, заключается в том, что в мире Apple контроллер является шаблоном посредника в дополнение к тому, чем он обычно является.

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

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

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

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

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

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

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

    08.03.2009
  • Таким образом, в отличие от моделей традиционного подхода в мире Apple, не уведомляют об изменениях взглядов — гм, да, они уведомляют — именно так это и работает. 04.05.2011

  • 6

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

    Вы можете прочитать эту статью Мартина Фаулера

    09.12.2008
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]