Проблема MVC
полягає в тому, що люди думають, що погляд, контролер і модель повинні бути максимально незалежними один від одного. Вони ні - погляд і контролер часто переплітаються - думають про це як M(VC)
.
Контролер - це механізм введення користувальницького інтерфейсу, який часто переплутується у зображенні, особливо з графічними інтерфейсами. Тим не менш, вигляд - це вихід, а контролер - вхід. Перегляд часто може працювати без відповідного контролера, але контролер, як правило, набагато менш корисний без перегляду. Зручні користувачі-контролери використовують погляд, щоб інтерпретувати вклад користувача в більш змістовному, інтуїтивно зрозумілому вигляді. Саме це ускладнює відокремлення концепції контролера від погляду.
Подумайте про радіокерований робот на полі виявлення в герметичній коробці як модель.
Ця модель стосується переходів стану та стану, без поняття виведення (відображення) або того, що викликає переходи стану. Я можу отримати позицію робота на полі, і робот знає, як перейти в положення (зробіть крок вперед / назад / вліво / вправо. Легко передбачити без виду або контролера, але нічого корисного не робить
Подумайте про вид без контролера, наприклад, хтось в іншій кімнаті в мережі в іншій кімнаті, спостерігаючи за положенням робота, як (x, y) координати, що протікають вниз консолі прокрутки. Цей погляд просто відображає стан моделі, але у цього хлопця немає контролера. Знову ж таки, легко уявити собі цей погляд без контролера.
Подумайте про контролер без виду, наприклад, хтось замкнений у шафі з радіоконтролером, налаштованим на частоту робота. Цей контролер надсилає вхід і викликає переходи стану, не маючи уявлення про те, що вони роблять для моделі (якщо вона є). Легко передбачити, але не дуже корисно без якогось зворотного зв'язку з погляду.
Більшість зручних користувальницьких інтерфейсів узгоджують подання з контролером, щоб забезпечити більш інтуїтивний інтерфейс користувача. Наприклад, уявіть собі перегляд / контролер з сенсорним екраном, що показує поточне положення робота в 2-D і дозволяє користувачеві торкатися точки на екрані, яка щойно перебуває перед роботом. Контролеру потрібні детальні відомості про вид, наприклад, положення та масштаб вікна перегляду, а також положення пікселя місця, яке торкнулося відносно положення пікселя робота на екрані), щоб інтерпретувати це правильно (на відміну від хлопця, зачиненого в шафі з радіоконтролер).
Я вже відповів на ваше запитання? :-)
Контролер - це все, що приймає дані від користувача, що використовується для приведення моделі в перехідний стан. Постарайтеся, щоб вигляд і контролер були відокремленими, але розумійте, що вони часто взаємозалежні один від одного, тож добре, якщо межа між ними нечітка, тобто мати перегляд і контролер як окремі пакети, можливо, не так чітко, як ви б розділили як, але це нормально. Можливо, вам доведеться прийняти, що контролер не буде чітко відокремлений від подання, оскільки подання від моделі.
... чи слід проводити перевірку тощо у контролері? Якщо так, то як я повертаю повідомлення про помилки назад до Перегляду - чи повинні вони повторно пройти через Модель, або ж Контролер повинен просто повернути його назад до Перегляду?
Якщо перевірка виконана в представленні, що я можу вставити в контролер?
Я кажу, що пов'язаний погляд і контролер повинні вільно взаємодіяти, не переходячи через модель. Контролер приймає введення користувача і повинен виконати перевірку (можливо, використовуючи інформацію з моделі та / або перегляду), але якщо перевірка не вдалася, контролер повинен мати можливість оновити пов'язаний з ним перегляд (наприклад, повідомлення про помилку).
Тест на кислотність для цього полягає в тому, щоб запитати себе в тому, чи повинен незалежний погляд (тобто хлопець в іншій кімнаті, який спостерігає за робочим положенням через мережу) бачити щось чи ні внаслідок чужої помилки перевірки (наприклад, хлопця в шафі спробував сказати роботові піти з поля). Як правило, відповідь - ні - помилка перевірки перешкоджала переходу стану. Якщо не було державних потягів (робот не рухався), немає потреби розповідати інші погляди. Хлопець у шафі просто не отримав жодного відгуку про те, що він намагався викликати незаконний перехід (немає виду - поганий користувальницький інтерфейс), і нікому більше не потрібно цього знати.
Якщо хлопець із сенсорним екраном спробував відправити робота з поля, йому надійшло приємне користувачеві повідомлення з проханням не вбивати робота, відправляючи його з поля виявлення, але знову ж таки, ніхто більше не повинен цього знати.
Якщо інші види дійсно потрібно знати про ці помилки, то ви фактично говорите , що входи від користувача і будь-які результуючі помилки частину моделі , і все це є трохи більш складним ...