Где М в MVC?

14

Я пытаюсь реорганизовать свое приложение в MVC, но я застрял на М-части.

В приложении, поддерживаемом базой данных, модель реализована в коде приложения, верно?

Но тогда, что находится в базе данных - это не модель?

(Я не использую базу данных в качестве простого хранилища объектов - данные в БД являются активом предприятия).


источник
I'm not using the database as a simple object store, Я предполагаю, что это означает некоторую бизнес-логику в базе данных в форме хранимых процедур. В теории это идет вразрез с MVC, но на практике это не имеет значения.
Яннис
@YannisRizos - в БД есть BL, но я имел в виду, что хочу, чтобы данные в БД имели жизнь и смысл вне приложения.
3
I want the data in the DB to have a life and meaning beyond the application.Какая?
Яннис
2
@YannisRizos - я определенно был бы признателен за помощь в рефакторинге этого заявления. Данные - это актив предприятия, верно? Он не принадлежит приложению - поэтому ему не разрешено создавать какую-то безумную денормализованную модель, которая делает его очень простым для приложения , если это делает повторное использование данных из других приложений очень трудным. Какие-либо предложения?
1
Это не будет проблемой, если существует формат для чего-либо существующего, который должен быть передан, то это становится частью требований к формату хранения. Все, что в будущем нуждается в этом в другом формате, может иметь задачу ETL или преобразовать ее в DAL.
StuperUser

Ответы:

46

Да, и модель в коде, и база данных являются «моделью».

Модель имеет отношение к тому, что ваше приложение «ЕСТЬ», а контроллер к тому, что оно «делает». Любой код, связанный с прямым сохранением в базе данных, считается моделью.

Примечание: MVC - это шаблон , так что не думайте слишком сильно. Легко научиться делать MVC правильно, но, в конце концов, это просто образ мышления! Это означает, что ваша бизнес-логика должна храниться вне базы данных и пользовательского интерфейса - вот и все. До MVC люди размещали бизнес-логику на своих веб-страницах, когда она должна быть на сервере, или у них была бы куча скриптов, запускающих базу данных, выполняющих бизнес-логику вместе с постоянным кодом. MVC был призван заставить людей задуматься таким образом, чтобы их код можно было многократно использовать, поэтому не стоит слишком увлекаться деталями.

Райан Хейс
источник
15
Итак, с точки зрения C и V, что база данных - это просто деталь реализации M?
Определенно. Красиво сформулировано.
Херби
3
@MattFenwick С точки зрения C и V, нет базы данных. Вы используете базу данных как нечто большее, чем хранилище данных, в терминах MVC база данных - это только хранилище данных. Но это прекрасно, если это подходит для вашего приложения.
Яннис
5
+1 за "не переусердствуй mvc"
Хавьер
2
«держите свою бизнес-логику вне базы данных и пользовательского интерфейса» - это
Дэвид Мердок
17

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

На практике в MVC обычно используются две модели: модель предметной области (что отображается в вашей базе данных) и модель приложения (также называемая моделью представления в современной терминологии). Модель приложения - это проекция модели предметной области, которая также содержит конкретные данные представления для визуализации представления. Этот подход называется MMVC . Контроллер напрямую взаимодействует с моделью предметной области и представляет модель приложения для представления. В шаблоне MVVM модель приложения и контроллер объединены.

Майкл Браун
источник
+1: мне больше нравится этот ответ. The model is a projection of your data.База данных предназначена для наиболее эффективного хранения данных для доступа и индексации. Вместо этого модель должна быть разработана вокруг бизнес-сферы.
Джоэл Этертон
У меня ушла секунда на разбор the Domain Model (what's mapping to your database). Хороший ответ!
2
+1 Это отличное описание различных вкусов, в которые превратился MVC.
Райан Хейс
Спасибо ребята. Я глубоко погрузился в это, когда писал свою книгу. Рад, что это имеет смысл!
Майкл Браун
3
  1. Вам не нужна база данных для MVC. Если ваша модель общается с базой данных, то отлично. Он также может сохраняться в виде плоского файла или вообще не сохраняться.

  2. Модель - это место, где данные хранятся в памяти вашего приложения. Вы также захотите использовать модель для проведения расчетов и проверки ее данных. Например, у вас есть модель FinancePayment со свойствами, такими как процентная ставка, срок и принцип. Вы можете добавить метод getMonthlyPayment () в свою модель для расчета ежемесячного платежа. Вы не хотели бы делать это в контроллере или представлении.

  3. Представление должно быть достаточно тупым, либо не иметь никакой логики, либо использовать только простое связывание данных (см. Шаблоны пассивного представления и контролирующего контроллера на сайте Мартина Фаулера ). Представление вызывает события, когда пользователь что-то делает, например, нажимает кнопку.

  4. Контроллер отвечает за обработку событий (запуск некоторого кода, когда пользователь нажимает кнопку «Сохранить»), а также за настройку свойств модели и указание модели загружать и сохранять себя (если используется постоянство). Контроллер не должен делать расчеты по данным модели. Однако в контроллере вы можете выполнять некоторые вычисления от имени представления, например, «if model.profit () <0 then widget.colour = 'red'"

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

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

Нил Макгиган
источник
Право на! Это очень ясно.
2

Модель - это код, который подключается к V и C во внешнем интерфейсе и к постоянному хранилищу (может быть что угодно, от файлов до баз данных SQL / NoSQL) во внутреннем интерфейсе. Это не только код, который загружается из БД и сохраняет в БД (что является одним из недоразумений модели), это код, который фактически выполняет всю работу «домена» - выбирает, фильтрует, изменяет, вычисляет, принимает решение по данные. Включает в себя всю не-UI логику приложения.

Херби
источник
Необработанные данные, которые вы хотите иметь постоянными. В любой организации, которая лучше всего подходит для вашей модели. Модель представляет собой API, который оживляет логику вашего приложения. Эта база данных является хранилищем (неживых) данных. Если это возможно для вашего приложения (я не знаю, какое это приложение), попробуйте перестать воспринимать его как «приложение с поддержкой базы данных», а просто как «приложение», которое использует базу данных как способ. сохранить данные модуля. Многие проблемы возникают из-за «иконизации» базы данных - это не что иное, как хранилище данных для модели; Вы можете отказаться от него, реструктурировать или заменить, если это поможет.
Херби
(выше относится только к сценариям, когда данные в БД не передаются другому приложению)
herby
Я извиняюсь за плохой выбор слов в своем комментарии - я хотел сказать, что я не уверен, что находится в базе данных по отношению к MVC . База данных вне MVC? Это часть модели? Является ли это частью V или C (вероятно, нет, но вы поняли).
Понимаю. Вы, вероятно, поняли из моего ответа, что вы можете видеть его как часть модели, которая служит для сохранения данных приложения, которые обрабатывает код из модели. (Я вижу РЕДАКТИРОВАТЬ): Если эта база данных является чем-то, что должно пережить приложение, тогда посмотрите на базу данных как на внешнюю службу, с которой должна взаимодействовать модель, получите данные для вычислений, а также отправьте часть обратно.
Херби
В крайнем случае, когда бизнес-логика находится в самой БД, вы можете иметь очень тонкую модель, которая в основном относится к БД, или даже сказать, что db - это ваша модель (но тогда она должна иметь всю логику).
Херби
2

Принимая очень упрощенный и идеалистический взгляд.

Модель обычно рассматривается как модель предметной области (грубо говоря, бизнес), а не как модель данных. Они могут выглядеть похожими, но они не полностью связаны друг с другом.

Представление должно быть моделью внешнего интерфейса приложения, а контроллер должен быть моделью потока от одного представления к другому.

Бизнес-логика должна быть полностью инкапсулирована в Модель, будь то в базе данных или в коде. Хотя некоторая бизнес-логика может повторяться в представлении или контроллере, по разным причинам должна быть возможность (и безопасность) полностью удалить эти два компонента и поставить на их место другой интерфейс.

прецизионный самописец
источник
1

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

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

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

Док Браун
источник
1
But then, what is in the database -- is that not also the model?

Нет это не так. « Модель управляет поведением и данными домена приложения». Часто Модель подключается к базе данных, но это никоим образом не является требованием. Модель представляет собой новый слой между вашим приложением и базой данных. Бэкэнд может быть набором объектов Mock, XML или чего-либо еще, поддерживающего сохранение данных.

Разъединяя слои, вы даете себе гораздо большую гибкость, чтобы использовать лучшие практики модульного тестирования, сделать код более управляемым (EG SQL заменяется Oracle) и другие преимущества.

То же самое касается контроллера. MVC определяет контроллер как посредника между двумя уровнями. В MVC не определен «бизнес-уровень». Скорее, вы добавляете свои собственные. MVC не включает в себя все уровни, необходимые для создания большинства приложений. Это просто общее руководство для базовой структуры.

Эти разделения являются ключом к разрешению инверсии управления, чтобы функционировать.

P.Brian.Mackey
источник
+1 за отличный и очень информативный ответ; хотя я бы предположил, что последнее предложение заслуживает пояснения. IoC не обязательно так широко известен и понят, поэтому он может добавить небольшую путаницу. Действительно полезное объяснение того, что вы подразумеваете под этим, возможно, выходит далеко за рамки здравомыслящего SE-ответа, но оно бросилось в глаза мне.
Адам Кроссленд
Однако если вы поместите свою бизнес-логику в хранимые процедуры, то да, база данных действительно охватывает модель. (Лично я не рекомендовал бы такой подход.)
Рой Тинкер
1
@ Рой Тинкер - Нет, это не имеет значения. Модель концептуально отделена. Будут сущности, которые интегрируются с базой данных где-то внутри слоя. Эти сущности должны оставаться отделенными от других сущностей, которые существуют в модели и имеют другие отношения (например, макет). Контроллер должен выполнять вызовы модели таким образом, чтобы он не знал, как и откуда поступают данные. Скорее это определение должно быть сделано с помощью внедрения зависимостей и IoC (в основном это интерфейс, который может быть привязан к различным бэкэндам, макетам или БД).
P.Brian.Mackey
1

База данных - это деталь реализации модели. Модель должна быть полной моделью предметной области и должна сочетать данные и процессы. Разделение должно проводиться между проблемами различий, а не между процессом и данными, связанными с этим процессом.

Смотрите также: http://martinfowler.com/bliki/AnemicDomainModel.html

Париж Синклер
источник
0

На самом деле это очень просто, «Модель» представляет абстракцию для интерфейса данных. Поэтому:

  • Базы данных рассматриваются как часть модели , но не сама модель
  • Данные Модели могут поступать из баз данных, файлов, веб-сервисов или даже быть поддельными.
  • Классы моделей в MVC, HMVC или аналогичных средах должны хранить запросы (см. Принцип «толстая модель, тощий контроллер» [ 1 ] [ 2 ] [ 3 ])

И - если я прав - именно поэтому, когда кто-то ссылается на модели вне контекста MVC, этот человек, скорее всего, ссылается на структуру данных (т.е. схему ).

dukeofgaming
источник
0

Я думаю, что М содержат некоторую логику и хранить данные в БД. Контроллер вызывает, какой модуль должен быть выполнен, и этот модуль будет выполнять логику и сохранять данные в БД (возможно, имеет постоянный уровень), а затем этот модуль возвращает значение V.

Марк Се
источник
0

M (odel) в MVC должен фиксировать модель бизнеса / домена в одном месте.

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

C (контроллер) в идеале должен заниматься только передачей информации бизнес-модели в представление (например, представление) и захватом пользовательского ввода из V (iew), чтобы инициировать изменения в состоянии модели.

Слой базы данных имеет дело (или, скорее, должен только иметь дело) с сохранением состояния модели в конкретный момент времени.

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

Роланд Тепп
источник
0

Модель в идеальном мире должна содержать только бизнес-логику, она моделирует некоторый реальный объект, такой как дом. Однако почти во всех случаях модель должна сохранять свои данные в некотором хранилище.

Взаимодействия между моделью и сохраненными данными могут происходить либо на отдельном слое данных, либо непосредственно в модели, что имеет место при использовании ORM (Object Relational Mapper). Другими словами, либо модель подключается напрямую к базе данных, либо передает свои данные в какой-то другой объект «доступа к данным», который подключается к базе данных.

ORM (Object Relation Mapper) сопоставляет поля в таблице базы данных с атрибутами вашего объекта модели, предоставляя методы получения и установки. В этом случае нет отдельного слоя данных, и модель несет прямую ответственность за сохранение своих данных.

Вот пример Ruby с ActiveRecordиспользованием популярного ORM:

class House < ActiveRecord::Base
end

house = House.new
house.price = 120000
house.save

Priceэто поле в housesтаблице, которое автоматически определяется с помощью ActiveRecordкоторого к объекту добавляются методы получения и установки. Когда saveвызывается, значение атрибута цены сохраняется в базе данных.

С моей точки зрения преимущество наличия уровня данных состоит в том, что вы получаете точку, в которой вы можете манипулировать данными, прежде чем они попадут в модель, модель меньше беспокоится, у нее меньше обязанностей. Например, вам может потребоваться объединить данные из нескольких несовместимых источников данных, это то, что ORM не может легко обработать.

Основным недостатком является еще один уровень абстракции для управления, если вам это не нужно, не беспокойтесь, будьте проще. Меньше движущихся частей, меньше ошибаться.

Kris
источник
-1

Да ты прав.

(Модель просмотра контроллера)

Архитектура для создания приложений, которые отделяют данные (модель) от пользовательского интерфейса (представление) и обработки (контроллер).

На практике представления и контроллеры MVC часто объединяются в один объект, потому что они тесно связаны. По данным MSDN

Контроллер интерпретирует ввод мыши и клавиатуры от пользователя, информируя модель и / или the view to change as appropriate.

Проверьте эту схему:

введите описание изображения здесь

Например, код контроллера проверяет запрос данных и заставляет его возвращаться в представлении. Объекты контроллера вида привязаны только к одной модели; тем не мение,a model can have many view-controller objects associated with it.

Ниранджан Сингх
источник
4
In practice, MVC views and controllers are often combined into a single object because they are closely related.Если вы делаете это, вы делаете это неправильно ...
Яннис
Откуда эта диаграмма? И откуда это определение? Пожалуйста, не копируйте вставки из интернета без указания авторства.
Яннис
@ Яннис Ризос - он цитирует документацию MS. Здесь это немного выходит из контекста, но они говорят, что не-веб-приложения часто имеют связь вида / контроллера, но у веб-приложений есть очень четкое различие. Вероятно, это одна из причин того, что вы не видите, что MS подталкивает MVC для своих приложений Windows (вместо MVVM), а только для веб-приложений. msdn.microsoft.com/en-us/library/ff649643.aspx
P.Brian.Mackey
1
@ P.Brian.Mackey Я подозревал, что MS как-то за этим стоит: P
yannis
Я отредактировал ваш ответ, добавив ссылку @ P.Brian.Mackey. Совершенно нормально цитировать внешние источники, но вы должны включить ссылки на них. Также MVVM может быть очень похож на MVC, но это не тот же шаблон. В MVC представления и контроллеры никогда не должны объединяться в один объект ...
yannis