Чи може на MVC кілька переглядів мати один і той же контролер, або один вид повинен мати один унікальний контролер?


15

У мене виникають запитання під час розробки архітектури проекту навколо MVC. (Це проект SD + C ++ / Marmalade, я не використовую жодної конкретної рамки MVC, я її роблю.)

У кількох статтях (як, наприклад, в оригінальній статті Стіва Бурбека ) я продовжую читати концепцію "тріади MVC", яка бовтає мене, оскільки я сприйняв цю концепцію досить буквально. Коли я прочитав це, то вперше схожий на те, що додаток побудовано навколо одиниць "тріади MVC" - по одному на кожну частину інтерфейсу, яку я припускав, - але я вважаю це досить гнучким, і я думаю, що MVC призначений не для використання. Потім, вивчаючи далі питання, я знайшов кілька прикладів жорсткого з’єднання контролера та перегляду, а саме відношення 1-1 - TextEditView має TextEditController.

Але коли я повертаюсь до свого проекту, я вважаю, що може бути корисним мати один контролер (за допомогою "логічної одиниці", наприклад AddElementController) та кілька переглядів для цього конкретного контролера.

Я чітко замислююся про щось на зразок AddElementController, який повинен мати якийсь інтерфейс вкладки. Чи повинен у мене бути AddElementController, який містить AddElementTabView та кілька AddImageView, AddSoundView тощо для вкладок? Або я повинен мати інший "підрядник" для кожного перегляду вкладок?

Підсумовуючи, і стосовно шаблону MVC (не конкретного розуміння / реалізації цього шаблону X-рамки), чи правильно мати декілька поглядів для контролера, чи має кожен вигляд мати конкретний контролер?

Крім того, чи правильно зберігати інформацію про стан на контролері чи вона повинна бути без громадянства (це означає, що стан повинен бути розміщений на деякій моделі бездоменного стану)?

Дякуємо всім заздалегідь.

Відповіді:


14

Проблема полягає в тому, що модель MVC була розроблена в системі, яка насправді вже не існує. Він був винайдений у Smalltalk у той час, коли бібліотеки інтерфейсу не існували. Щоб здійснити вікно діалогу, ви намалювали всі поля, виділили відповідні квадрати, переконалися, що текст, який ви малювали, опинився в потрібному місці ... тощо ...

Уявіть, як було б написати діалоговий додаток, використовуючи лише одне велике полотно. Ось світ, з якого походить MVC.

"Вид" у цій системі був текстовим полем, і саме клас відповідав за малювання поля, тексту, малювання виділених областей, реагування на зміни в тексті тощо ...

"Контролер" був іншим класом, який приймав події миші, що відбувалися в цьому полі, наприклад, переміщення миші, натискання клавіші, натискання клавіш, натискання клавіш тощо, і воно вирішило, що сталося. Чи слід змінювати текст? Чи слід змінити вибір? Такі речі.

"Модель" була ще одним класом, який представляв основні дані та стан компонента. Модель текстового поля повинна містити текст звичайно, шрифт, виділення тощо ...

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

Сьогодні, якщо ви працюєте над створенням бібліотеки інтерфейсу користувача та використовуєте необроблені команди для малювання, ви можете зробити щось подібне. Але застосування шаблону "MVC" вийшло за межі його початкового призначення. Зараз у вас є "перегляд", який насправді може бути повним діалоговим вікном, і контролер, який реагує на такі події, як "textChanged" або "buttonClicked". Модель у сьогоднішньому MVC, як правило, є щось досить відключене від системи (але, як правило, пов'язане з видом, забезпечуючи певний інтерфейс для спостерігачів), і може бути багато поглядів, пов'язаних з однією моделлю.

Наприклад, в системі, яку я нещодавно архітектурував, ми мали близько 10+ переглядів, за якими спостерігали один "власник" документа та його активний документ. Основний інтерфейс малювання взаємодіяв з компонуванням документа, різноманітними видами властивостей, які спостерігали вибраний елемент та забезпечували інтерфейс запису, та меншим масштабним поданням основного виду, який показував весь документ замість лише видимого вікна. Деякі з цих поглядів мали контролери різної складності, які перетворювали події GUI в зміни в документі, які, в свою чергу, сповіщали про різні погляди.

Ви ще можете назвати такі відносини "тріадою"? Можливо, але я думаю, що це передбачає занадто багато колишнього, старішого застосування MVC.

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


5

Це залежить. Існує кілька варіантів MVC, деякі з яких лише стосунки 1: 1 мають сенс (наприклад, "скромне діалогове вікно"), інші, де це не так. Я рекомендую прочитати серію статей " Створіть свій власний CAB ", пояснивши найважливіші варіанти MVC.


3

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

Ви можете / матимете абсолютно багато переглядів контролера. Подумайте над створенням моделі для кожного перегляду, якщо ви хочете дотримуватися шаблону MVC.


3

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

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

Контролер може завжди повертати один і той же вигляд (1: 1), якщо є лише один вид запиту, який користувач може подати до контролера, і він завжди вимагає однакового відповіді. Наприклад, HelloWorldControllerзавжди буде повертатися HelloWorldViewпоказ "Привіт, світ!"

З іншого боку, контролеру часто доводиться приймати рішення про різні погляди, залежно від того, про що говорить модель. TeamRosterControllerМоже повертати RugbyTeamRosterViewабо FootbalTeamRosterView, в залежності від типу команди запитували.

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

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

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