В идеале MVC представление должно знать модель? - PullRequest
7 голосов
/ 18 сентября 2010

Мой вопрос об идеальной или оригинальной интерпретации MVC http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html

Поскольку целью MVC является уменьшение зависимостей, должен ли View знать модель? Тогда что может помешать ему стать толстым и напрямую вызывать методы модели, не спрашивая контроллер?

Обновление: читая ответ ниже, я приведу конкретный пример:

Допустим, вы создаете сложный калькулятор (не просто какой-нибудь простой, скажем, опционный оценщик для фондового рынка). Требуется только такой вклад, как цена акций, процентная ставка, волатильность. Так зачем мне создавать ссылку на всю модель, которая содержит методы из представления, поскольку мне нужны ТОЛЬКО эти входные переменные?

Почему контроллер не просто получит уведомление, когда что-то изменится в представлении, а затем вызовет метод в представлении только с вводом?

Например, здесь я вижу, что представление имеет ссылку на всю модель:

http://leepoint.net/notes-java/GUI/structure/40mvc.html

private CalcModel m_model;

Ответы [ 5 ]

18 голосов
/ 18 сентября 2010

Представление не должно знать о модели business , это зависит от контроллера.Однако представление должно знать о модели data .Как еще он должен это представить?

См. Также:

8 голосов
/ 18 сентября 2010

Тогда что бы помешало ему стать толстый и вызовите напрямую методы модели не спрашивая контроллер? не спрашивая контроллер?

Я нашел это немного смешным. У представлений нет собственного разума, но у программистов есть. Именно они принимают неверные решения и дают View разрешать делать то, что он делает.

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

Другим может быть использование AOP. Напишите аспект, который предотвращает вызовы на уровень служб, которые не поступают ни от других служб, ни от контроллеров.

Есть еще одна точка зрения: AJAX - это все о том, что Views берет вещи в свои руки и звонит в сервисы, без чьего-либо разрешения, чтобы делать вещи асинхронно и улучшать скорость отклика для лучшего взаимодействия с пользователем. Это хорошо вещь.

Не слишком зацикливайтесь на архитектурной чистоте. MVC - это прекрасный шаблон, и очень полезный, когда он применяется. Знать правила; знать, когда уместно нарушать правила. Не будь таким догматичным - в программировании или в жизни.

4 голосов
/ 18 сентября 2010

Да, в MVC мнение знает о модели.Фактически, задание job состоит в том, чтобы отображать модель, чтобы она знала о модели.Модели должны быть достаточно простыми и не должны быть в значительной степени контейнерами состояния (т. Е. Свойствами, которые являются строками, целочисленными значениями и т. Д.) - у него не должно быть методов.

Контроллер знает об обоихпредставление и модель - задача контроллера состоит в том, чтобы получить соответствующую модель и передать ее соответствующему представлению.

Модель должна быть совершенно неосведомлена ни о контроллере, ни о представлении.

Этотипичное разделение проблем в MVC (SoC), где каждый компонент имеет свою четко определенную «работу».

1 голос
/ 18 сентября 2010

В MVC дело не в том, что вы не должны общаться между MVC.Суть в том, чтобы отделить модель от вида (и контроллера), чтобы вы могли легко менять / заменять компоненты.

http://en.wikipedia.org/wiki/Model%E2%80%93View%E2%80%93Controller

0 голосов
/ 18 сентября 2010

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

Например, бизнес-логика могла бы выглядеть так:

  view->report->annual_revenue =
    this->first_quarter_rev +
    this->second_quarter_rev +
    this->third_quarter_rev +
    this->fourth_quarter_rev;

В то время как логика представления:

  if (!this->report->annual_revenue) {
    print('No information')
  }
  else {
    print(format('# ###', this->report->annual_revenue) + '$');
  }
...