Проблема с MVC
заключается в том, что люди думают, что вид, контроллер и модель должны быть максимально независимыми друг от друга. Они не - видение и контроллер часто переплетаются - воспринимают это как M(VC)
.
Контроллер - это механизм ввода пользовательского интерфейса, который часто запутывается в представлении, особенно в графических интерфейсах. Тем не менее, представление является выводом, а контроллер - вводом. Представление часто может работать без соответствующего контроллера, но контроллер обычно гораздо менее полезен без представления. Удобные для пользователя контроллеры используют представление для интерпретации ввода пользователя более осмысленным и интуитивно понятным способом. Это то, что затрудняет отделение концепции контроллера от представления.
Представьте в качестве модели радиоуправляемого робота на поле обнаружения в запечатанной коробке.
Модель полностью посвящена переходам между состояниями и состояниями без понятия вывода (отображения) или того, что вызывает переходы состояний. Я могу определить положение робота на поле, и робот знает, как перейти в другое положение (сделать шаг вперед / назад / влево / вправо. Легко представить без вида или контроллера, но ничего полезного не делает
Представьте себе вид без контроллера, например, кто-то в другой комнате в сети в другой комнате наблюдает за положением робота, когда координаты (x, y) текут по консоли прокрутки. Этот вид просто отображает состояние модели, но у этого парня нет контроллера. Опять же, легко представить это представление без контроллера.
Подумайте о контроллере без представления, например, кто-то заперся в шкафу с радиоуправлением, настроенным на частоту робота. Этот контроллер отправляет входные данные и вызывает переходы состояний, не имея представления о том, что они делают с моделью (если что-либо). Легко представить, но не очень полезно без какой-либо обратной связи с представлением.
Наиболее удобный пользовательский интерфейс координирует представление с контроллером, чтобы обеспечить более интуитивно понятный пользовательский интерфейс. Например, представьте себе представление / контроллер с сенсорным экраном, показывающее текущее положение робота в 2-D и позволяющее пользователю коснуться точки на экране, которая как раз оказывается перед роботом. Контроллеру нужны подробности о представлении, например, положение и масштаб области просмотра, а также положение точки, которой коснулись пикселя, относительно положения пикселя робота на экране), чтобы правильно интерпретировать это (в отличие от парня, запертого в шкафу с радиоконтроллером).
Я уже ответил на ваш вопрос? : -)
Контроллер - это все, что требует ввода от пользователя и используется для перехода модели в состояние перехода. Постарайтесь держать представление и контроллер в отдельности, но понимайте, что они часто взаимозависимы друг с другом, так что все в порядке, если граница между ними нечеткая, то есть представление и контроллер в качестве отдельных пакетов могут быть не такими чистыми, как вы нравится, но это нормально. Возможно, вам придется признать, что контроллер не будет чисто отделен от вида, так как вид от модели.
... должна быть любая проверка и т. Д.
сделано в контроллере? Если да, то как
Я возвращаю сообщения об ошибках обратно в
Просмотр - должен ли это пройти через
Модель снова, или должен контроллер
просто отправить его обратно в View?
Если проверка выполняется в представлении,
что мне поставить в контроллере?
Я говорю, что связанный вид и контроллер должны свободно взаимодействовать, не проходя модель. Контроллер принимает данные пользователя и должен выполнять проверку (возможно, с использованием информации из модели и / или представления), но если проверка не удалась, контроллер должен иметь возможность напрямую обновлять свое связанное представление (например, сообщение об ошибке).
Кислотный тест для этого состоит в том, чтобы спросить себя, должно ли независимое представление (т. Е. Парень в другой комнате, наблюдающий положение робота через сеть) видеть что-либо или нет в результате чьей-либо ошибки проверки (например, парень в шкафу пытались сказать роботу сойти с поля). Обычно ответ отрицательный: ошибка проверки помешала переходу состояния. Если не было государственных переходов (робот не двигался), нет необходимости сообщать другим мнения. Парень из шкафа просто не получил никаких отзывов о том, что он пытался вызвать нелегальный переход (нет просмотра - плохой пользовательский интерфейс), и никто другой не должен это знать.
Если парень с сенсорным экраном попытался отправить робота с поля, он получил приятное сообщение, в котором просил не убивать робота, отправив его с поля обнаружения, но, опять же, больше никто не должен знать об этом .
Если другие представления do должны знать об этих ошибках, то вы фактически говорите, что входные данные от пользователя и любые возникающие в результате ошибки являются частью модели и всего этого немного сложнее ...