MVC вопрос дизайна - PullRequest
       3

MVC вопрос дизайна

1 голос
/ 15 апреля 2011

Просто заметка, я новичок в MVC.

Я пытаюсь сделать свой код максимально изолированным и тестируемым.У меня есть вид с текстовым полем и кнопкой.Я хочу включить кнопку при вводе нового текста и соблюдении определенных критериев.

В идеале мне бы хотелось, чтобы эта логика решала, включена ли кнопка или нет за пределами представления, чтобы ее можно было проверить модулем..

Мое понимание MVC выглядит следующим образом: в моем виде у меня есть ссылка на мой контроллер.В моем контроллере у меня есть ссылка на мою модель.В моей модели у меня есть ссылка на мой вид.

Можете ли вы сказать мне, если следующий дизайн хороший.Я добавил логическое значение для кнопки buttonEnabled.последовательность событий такова: текст вводится в текстовое поле, текстовое поле имеет слушателя.Слушатель вызывает метод textChanged на контроллере, контроллер проверяет, активировать ли кнопку или нет, и затем устанавливает buttonEnabled модели через метод доступа setButtonEnabled.Метод доступа изменяет значение buttonEnabled и вызывает buttonEnabledChanged () для представления (которое предоставляет этот метод), идея состоит в том, что представление является конкретным наблюдателем модели, а модель является наблюдаемой, которая теоретически может иметь несколько представлений, иможет вызвать buttonEnabledChanged () для всех из них.

Пожалуйста, дайте мне знать, что вы думаете.

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

То, что вы предлагаете, слишком сложно и, на мой взгляд, неправильно с точки зрения MVC.

  • Контроллер не должен проверять, нужно ли включать кнопку, это задача модели.
  • Модель не должна вызывать какие-либо методы для просмотра.
  • У вас слишком специфические методы. Это желание обновлять только определенные вещи, такие как buttonEnabledChanged (), усложнит ситуацию в будущем, когда компоненты зависят друг от друга через некоторую бизнес-логику.

Вам нужно привязать значение этого текстового поля к значению модели, возможно, через контроллер. Таким образом, изменение значения текстовых полей изменит значение модели. Затем следует вызвать обновление по представлению. Представление знает, что в модели есть какое-то свойство, которое определяет, должна ли кнопка быть включена. Он не должен вызываться isButtonEnabled (), потому что он не зависит от представления. Он должен называться isTextMatchingCriteria или как-то так. Основываясь на значении этого свойства, представление решает, активировать кнопку или нет.

Таким образом:

  • Контроллер только контролирует. Он ловит и делегирует, обновляет, но ничего не решает по бизнес-логике.
  • Модель не зависит от вида.
  • В представлении нет специальных методов, которые можно вызывать отдельно. Единственное, что он может - это правильно представить презентацию на основе текущего состояния модели. Также указывается, что означает то или иное состояние модели на экране - отключенная кнопка или сообщение об ошибке. Модель не должна этого делать.
1 голос
/ 15 апреля 2011

Это философский ответ на философский вопрос:)

То, что вы предлагаете, может быть правильным. Но реальный вопрос в том, действительно ли buttonEnabled является хорошим кандидатом для вашей модели. Это чисто графический интерфейс и нет смысла быть там. Вещь, которая действительно специфична для интерфейса, принадлежит представлению, и больше нигде.

Теперь может быть причина, по которой кнопка отключена (например, запись недействительна). Тогда вы можете просто дать ему другое имя в модели (isValid). Перевод с !isValid на !buttonEnabled станет частью контроллера или даже самого представления.

Но я предполагаю, что в вашем случае единственная причина заблокировать кнопку, когда нет содержимого, состоит в том, чтобы уменьшить вероятность отправки пользователем в чистом виде. В этом случае я бы сделал проверку полностью (javascript, если это веб), просто для удобства пользователя. В модели просто сгенерируйте исключение (IllegalArgumentException кажется вероятным), если пустая строка все равно туда попадет.

Если вы проводите модульное тестирование своей модели, имеет больше смысла проверить, будет ли она жаловаться на пустую строку, а затем проверить, установлена ​​ли для вашей модели buttonEnabled в значение false. Если вы действительно хотите протестировать функциональность графического интерфейса, для этого есть решения (для Интернета на ум приходит селен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...