Архитектура MVC

Я хотел бы получить разъяснения в архитектуре MVC. Просматривая некоторые документы, я мог видеть, что между моделью-представлением и контроллером устанавливаются следующие отношения. Пожалуйста, помогите мне понять, как это возможно.

  1. Просмотр состояния модели запросов
  2. Модель передает информацию о состоянии в представление

person Community    schedule 28.07.2009    source источник


Ответы (4)


MVC следует нескольким простым правилам.

  • Модель говорит с контроллером
  • Контроллер говорит с представлением
  • Представление никогда не взаимодействует с Моделью.

Ваша модель обычно сопоставляется с таблицей базы данных. Например, если у вас есть таблица «сообщения в блогах» с двумя столбцами «заголовок» и «тело», вы можете сделать следующее:

Blogpost.create(:title => "Hello", :body => "World")

Вы только что создали запись в блоге! Теперь в вашем контроллере вы сделаете что-то вроде:

blogs = Blogpost.find(:all)

Теперь вы можете передать переменную blogs в свое представление, и оно решит, как отображать эти данные пользователю. Извините, если мой пример кода не совсем ясен, он написан на Ruby (on Rails), который в настоящее время является моим предпочтительным языком MVC.

person Mike Trpcic    schedule 28.07.2009
comment
Во многих статьях, которые я читал, говорится, что View может говорить с моделью. Это просто не типичная или каноническая версия паттерна. - person Dinah; 28.07.2009

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

Однако MVC не является жестким правилом. Есть много интерпретаций, и когда делать это «правильно» было бы уродливее, чем немного отклоняться от правил, последнее обычно предпочтительнее.

person Andy Riordan    schedule 28.07.2009

Допустим, у вас есть объект с именем View и объект с именем Model. Каждый объект содержит ссылку на другой. Описанный вами способ работы заключается в том, что View будет вызывать функцию в модели, запрашивая статус модели, а модель будет возвращать нужную информацию. Более эффективный способ его реализации состоит в том, что Модель сообщает Состояние, когда что-то изменилось, а Представление затем запрашивает информацию, которую оно хочет. У меня нет с собой примера кода, но вы можете изучить использование шаблона проектирования Observer для этого.

person mnuzzo    schedule 28.07.2009

Я уже видел документ, описывающий «треугольную» форму MVC, и я полагаю, что кто-то в какой-то момент заставил ее работать (либо так, либо в документах об этом просто говорится о бесполезном программном обеспечении). Однако я не нашел в этом большого практического применения, так как это приводит к серьезной проблеме «инженерии» программного обеспечения: циклической зависимости. Если ваше представление зависит от точной формы модели, чтобы выполнять некоторые запросы, а модель зависит от точной формы контроллера, а контроллер зависит от точной формы представления, тогда становится практически невозможно поменять местами из любого из этих элементов.

Я обнаружил, что очень полезно иметь модель, которая не зависит ни от чего, кроме простой программы командной строки. Представление, которое не зависит ни от чего, кроме любого инструментария графического интерфейса или API для рисования графики, который вы используете, и контроллера, который действует как посредник между ними, обеспечивая эту развязку. Это стратегия, которая позволяет вам создавать модели и представления, которые являются модульными и взаимозаменяемыми, оставляя только один компонент: контроллер со всеми этими неприятными зависимостями.

Конечно, может быть какая-то «официальная» версия шаблона MVC, но я не смог пробраться через какой-либо документ, претендующий на описание такой вещи в такт, с каким-либо большим смыслом, который действительно применим к системы реального мира. Но, может быть, я просто тупой в этом плане.

person Breton    schedule 28.07.2009
comment
Да, но если вы абстрагируете каждую часть, представление, модель и контроллер, чтобы они соответствовали шаблону, который вы имеете в виду, то вы обходите проблему. У вас всегда должен быть некоторый уровень абстракции. Я управлял несколькими работающими официальными программами MVC, но вам не нужно строго придерживаться шаблона. Вы всегда можете изменить их под свои нужды. Это скорее рекомендации, чем настоящие правила. - person mnuzzo; 28.07.2009
comment
Я не уверен, что вы подразумеваете под абстрактным в этом случае. Вы имеете в виду заранее решить, какими будут интерфейсы между частями? Я нахожу такой подход довольно трудным, я не достаточно хороший программист, чтобы знать наверняка, будет ли проект работать заранее, до того, как я его создам, и до того, как у меня будет возможность сделать настройки, поэтому в зависимости от интерфейса, который я разработал в начале, и не могу изменить звуки страшно. Может быть, вы имеете в виду что-то другое. - person Breton; 28.07.2009
comment
Нет, я имею в виду абстрактный класс или интерфейс, который могут наследовать другие подобные объекты для создания стандартного способа взаимодействия между классами. Однако не стоит слишком абстрагироваться, это создаст другие проблемы. - person mnuzzo; 28.07.2009
comment
Это то, что я думал, что вы имели в виду. Моя та же проблема применима, хотя. Когда именно вы разрабатываете этот интерфейс? Это своего рода просто смещение проблемы, вместо того, чтобы класс зависел от другого класса, он зависит от абстракции. Может быть, я слишком много думаю об этом. Может быть, я подумав об этом. Может быть, мне просто нужно вздремнуть. - person Breton; 28.07.2009
comment
Вот почему я обычно использую наблюдателя Java. Это дает вам достаточно абстракции, когда у вас есть общие классы для уведомлений, но вы не настолько абстрактны, чтобы определять все, что вы можете сделать. Насколько я понимаю, уведомления — это единственное, что вам нужно стандартизировать, все остальное может быть прямым. Одна вещь, которую я усвоил на своем курсе разработки программного обеспечения, заключается в том, что ничто не может быть по-настоящему независимым, всегда будут зависимости. Суть в том, чтобы держать их на приемлемом уровне. - person mnuzzo; 28.07.2009