Правильний перегляд моделі -_____ дизайн


14

Я читав про Controller Model View, Model View Presenter, Model View ViewModel і так далі, і загалом поняття, що лежить в основі, здається досить простим: зрозуміти, що гарні візуальні та наукові кишки є окремими та неосвіченими один до одного, як можливо. Немає логіки арахісового масла в дизайнерському шоколаді; круто, мені це подобається.

Проблема в тому, що я все ще трохи нечіткий щодо тієї третьої частини ... тієї, що не є моделлю чи переглядом. У кожного, схоже, є своя ідея, як його називати, що він повинен робити, що належним чином, що просто не так ... і я збиваюся з думки, намагаючись зрозуміти, коли презентатор стає ViewModel і коли View не повинен ' не робити це, тому що це робота ведучого і ...

Я розгулюю.

Замість того, щоб попросити когось пояснити різницю між ними - адже це вже було зроблено раз і раз (я знаю; я прочитав більше статей, ніж можу порахувати) - мені було б цікаво почути думки небагато програмістів на тій моделі, яку я сам спіймав.

З цього приводу , що б ви класифікували цей дизайн як, і, мабуть, важливіше, чи бачите ви про це щось, що очевидно смокче? Звичайно, я хотів би почути, що я роблю добре, якщо це справді міцний дизайн, але я б швидше дав ґрунтовні поради над похвалою.

Примітка: я буду використовувати "Міст" для загадкової третьої частини Model-View-? щоб уникнути будь-яких підсвідомих пропозицій того, яким воно має бути ".

Модель

  • Є повноваження щодо даних.
  • Отримує інформацію про запитувані зміни від Міста.
  • Містить і виконує всю логіку того, як дані стосуються інших даних.
  • Повідомляє міст, коли дані змінюються (для даних, якими Bridge виявив інтерес). Редагування слів: Дозволяє стороннім абонентам (про яких вона нічого не знає) контролювати стан або результати розрахунків.
  • Має нульові знання про Вид.

Вид

  • Займається наданням користувачеві способу перегляду та обробки даних.
  • Отримує інформацію про оновлення даних від Bridge.
  • Містить та виконує всю логіку щодо подання даних та елементів керування користувачеві.
  • Повідомляє міст, коли користувач здійснив дію, яка (можливо) впливає на Модель.
  • Інформує міст, яка інформація його цікавить.
  • Має нульові знання про Модель.

Міст

  • Є координатором і перекладачем між Модель та Вид.
  • Вносить будь-які відповідні зміни форматування для інформації, що передається між Моделлю та Переглядом.
  • Зберігає інформацію про те, "хто повинен знати, що".
  • Володіє знаннями як моделі, так і виду.

додаткові нотатки

  • У складніших програмах зазвичай існує декілька Моделей. У цій ситуації міст, як правило, бере на себе завдання координації / перекладу між декількома Моделями, і, таким чином, стає авторитетом щодо того, до чого повинні бути побудовані моделі протокольних / API / дизайн. (наприклад, якщо створюється програма для карткових ігор та ви хочете побудувати альтернативну модель переміщення колоди, слід використовувати Bridge для визначення функцій, необхідних для належного зв’язку з мостом.)
  • У невеликих простих програмах, що мають лише один вид і модель, міст звичайно "припускає", яка функціональність доступна з обох сторін. Однак, оскільки програми стають складнішими, рекомендується, щоб Перегляд (и) та Моделі (и) звітували про свою функціональність на Bridge, щоб уникнути неефективності та помилок.

Я думаю, що саме про це висвітлює. У будь-якому разі я вітаю будь-які питання, які ви можете мати щодо дизайну, який я схильний використовувати, і я також заохочую будь-які пропозиції.

І як завжди, дякую за ваш час.


2
Блок View має помилку копіювання-вставки. Я думаю, що в останній кулі повинно бути написано "Має нульове позначення моделі". І останнє речення 1-ї додаткової записки, мабуть, має закінчуватися "моделлю", а не "мостом" ??
Йоганнес С.

Відповіді:


7

Ваша фраза

"Є координатором і перекладачем між Моделлю та Поглядом."

вказує на те, що ваш Bridge є ведучим в архітектурі MVP.

MVP і MVC дуже схожі, за винятком того, що в MVP тільки Presenter спостерігає Модель, тоді як у MVC View також дозволено безпосередньо спостерігати Модель (без презентатора як "міст").

Ваша відповідальність за модель

Msgstr "Повідомляє міст, коли дані змінюються (для даних, якими Bridge виявив інтерес)."

це, мабуть, погано сформульоване або, можливо, помилка: ви не хочете, щоб модель залежала ні від моста / презентатора / контролера, ні від виду. Натомість ви використовуєте або шаблон спостерігача, події, або реактивне програмування, щоб дозволити Місту підписатися на зміни в Моделі. І тоді ви можете перефразувати свою відповідальність як:

"Дозволяє стороннім абонентам (про яких він нічого не знає) контролювати стан або результати розрахунків."

Якщо ваша модель не має залежностей від контролера або перегляду, її легше перевірити і значно більш портативно.


1
Якщо ключова відмінність полягає в тому, якщо Перегляд може або не може спостерігати модель, то дизайн, безумовно, більше MVP; Перегляд і модель ніколи не дозволяють говорити безпосередньо в дизайні, який я використовував.
KoratDragonDen

Відповідальність Моделі була поганою формулюванням. Модель насправді не має поняття і не піклується про те, хто / що / чому з речей, які хочуть слухати її, але просто опублікує будь-які зміни, які були внесені до її передплатників. Це ідеально вміст існувати поодинці без будь-якого абонента і не робить спроб вимагати нових передплатників.
KoratDragonDen

1
Тоді здається, у вас хороший дизайн. PS Причина вважати MVC над MVP полягає в тому, що, без дисципліни, ведучий може перевантажуватись.
Ларрі ОБрієн

1
+1 - просто вказати різницю між MVC та MVP. Як і ОП, решта Інтернету залишила мене повністю втраченою щодо того, чи були ці абревіатури навіть найменшими різницями.
Ixrec

5

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

Є оригінал, що реалізований у smalltalk і який корисний для локальних систем gui, і є те, що я схильний вважати web-mvc, який міняється деякими обов'язками перегляду та контролерів, щоб контролери могли сидіти на сервері з перегляди, що знаходяться на клієнті (можливо, у вигляді відредагованого HTML, або, можливо, через ajax).

Ваш опис мені звучить так, що він би знаходився в більшості визначень web-mvc.


Це могло б пояснити, чому у мене виникло стільки проблем, щоб обернути голову навколо концепції. Дякую; добре знати, що я (напевно) не роблю нічого страшенно неправильного з концепцією MVC.
KoratDragonDen

Для сучасних односторінкових веб-додатків ми повернулися до класичного шаблону MVC на стороні клієнта.
Кевін Клайн

2

У спільноті програмування багато дискусій щодо цієї точної номенклатури. Здається, ніхто майже нічого не погоджується.

Для мене те, як міст підключений до виду, здебільшого визначає назву.

  • Якщо на мості може бути збірка переглядів, то міст є контролером.
  • Якщо завжди є один вид на міст, то міст є ведучим.
  • Якщо може бути колекція мостів на один вид, то міст є моделлю виду.

Іноді речі не так чітко вирізані. Наприклад, презентатор може бути підключений до складеного виду, виготовленого з декількох підпоглядів, або контролер може бути створений без будь-якого знання його поглядів. Незважаючи на це, я думаю, що мої правила - це гарний початок.


В якості побічної ноти, я люблю поєднувати такі обов'язки:

Модель

Первинна відповідальність: збереження даних
Вторинні ролі: перевірити оновлення, повідомити спостерігачів про оновлення

Вид

Первинна відповідальність: Наявні дані
Вторинні ролі: Прийміть вхід, присутні UX

Міст

Первинна відповідальність: оновлення даних
Вторинні ролі: чисте введення, синхронізація даних та поглядів


0

Хоча ваш запропонований зразок здається правильним на поверхні, і він буде незаперечно працювати для невеликих примірників, оскільки додаток стає складнішим, ви зіткнетеся з проблемами, коли ви не впевнені, що оновлює, що, хто слухає, де і чому я намагаюся керувати такою кількістю Моделей зсередини стільки Переглядів, всім, кому потрібен доступ до іншого тощо.

Я рекомендую поширити свої ідеї, використовуючи таку схему (взята з розмови Емі Паламонтайн Ворог держави ):

Моделі

  • Синхронізувати стан із сховищем даних
  • Обробляти перевірку нових / оновлених даних
  • Підвищуйте події, коли вони змінюють стан

Перегляди

  • Відображення шаблонів
  • Обробляти події моделі
  • Обробляти події DOM
  • Посередник взаємодії моделі та DOM

Контролери

  • Керує максимум парою моделями та переглядами
  • Відстежує перегляди в контейнері

Модулі

  • Логічне групування контролера та його поглядів та моделей
  • Тестируемо
  • Невеликий та ремонтопридатний (Єдина відповідальність)
  • Координує (за допомогою Контролера) стан та події його переглядів та моделей
  • Безкоштовно представляти власні погляди
  • Не вільно обирати, де представити свої погляди

Диспетчер макета

  • Відповідає за композицію макета
  • Визначає оболонку програми в DOM з областями, в яких Модулі можуть представляти свій вміст

Диспетчер

  • Слухає події (через глобальний потік PubSub)
  • Відповідальний за завантаження нових модулів на основі подій
  • Віддає завантажені модулі менеджеру макетів
  • Керує всією тривалістю експлуатації модуля (створення, очищення, кешування тощо)
  • Приклади подій:
    • Зміни маршруту (включаючи початковий маршрут завантаження)
    • Взаємодія користувачів
    • Подія модуля спливало від події Model через зміни стану на стороні сервера тощо

Застосування

  • Відповідає за загальну настройку, миттєво застосовує такі речі:
    • Диспетчер
    • Маршрутизатор
    • Потік PubSub
    • Лісоруби
    • тощо

Цей тип шаблону дозволяє вашій програмі бути компонованою, перевіреною одиницею, знімає складність, з якою мост накопичувався б у часі, зберігає непогано відокремлені проблеми тощо.

Як вказує Емі: Будьте обережні, щоб не створити сервер на клієнті. І будьте обережні, щоб не потрапити в доктрину "Я створюю рамку MV *, тому я повинен ___!" Натомість візьміть усі ці ідеї (та інші відповіді тут) і знайдіть, що найкраще підходить для вашої програми та команди.

Я настійно рекомендую переглядати розмову Емі Паламонтайн Ворог держави (з якої ці ідеї прийшли) або принаймні переглянути слайди з розмови .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.