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