Можно ли провести какую-либо обработку на модели? [MVC]

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

Случай, поднявший этот вопрос, - видео-сайт. У меня есть класс (модель) видео, и одна из вещей, которые мне нужно делать, когда пользователь просматривает видео, мне нужно, чтобы представление было зарегистрировано в базе данных. Я не уверен, нужно ли мне добавить запрос в контроллер или можно добавить метод addView в класс Video.

Для меня основной вопрос: какими методами я ограничен в моделях? Может ли это быть что-нибудь или это должны быть только методы доступа (также известные как getValue / setValue)?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
443
6

Ответы 6

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

Поскольку вы можете использовать любой код модели с MVC (не только LINQ), краткий ответ - да. Что делать в модели должен - это, возможно, лучший вопрос. На мой вкус, я бы добавил свойство ViewCount (которое, вероятно, соответствует столбцу в таблице Video, если вы не отслеживаете каждого пользователя, и в этом случае оно будет в таблице UserVideo). Затем с помощью контроллера вы можете увеличить значение этого свойства.

Лучше бы в модели реализовать то, что происходит при просмотре видео. Что произойдет, если вы захотите просматривать видео с нескольких контроллеров? Что происходит, когда вы хотите изменить ведение журнала «просмотр видео» (например, записать также идентификатор текущего пользователя).

tvanfosson 01.12.2008 04:42

Точно - если это было непонятно, я говорил о реализации этого свойства в модели. А затем вы можете абстрагироваться от этого, создав метод в модели под названием RecordView или что-то в этом роде, и при этом вы увеличиваете свойство ViewCout, а также делаете все, что может потребоваться.

D'Arcy Rittich 01.12.2008 05:16

У Ruby on Rails девиз тонкий контроллер, толстая модель. Это относится не только к Rails, и это следует практиковать с любым фреймворком mvc.

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

Бизнес-логика принадлежит контроллеру. Держите его подальше от модели и просматривайте.

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

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

  • Модель «тупая», то есть она содержит только состояние представления и никакой дополнительной бизнес-логики. Модели не должны содержать ссылку ни на представление, ни на контроллер.

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

Если вы пурист MVC, то для модели не имеет смысла обновлять себя или базу данных, поскольку эти обязанности принадлежат контроллеру, поэтому было бы целесообразно создать метод addView для вашего класса Video с помощью нет.

Но в этой модели вы, как правило, генерируете слои внутри слоя контроллера ... Это немного сложнее.

Loki 01.12.2008 05:16

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

D'Arcy Rittich 01.12.2008 05:22

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

tvanfosson 01.12.2008 06:21

По крайней мере, в этих случаях BL необходимо полностью абстрагировать от базы данных; и проработайте Модель, чтобы выполнить логические действия.

dkretz 09.12.2008 04:42

-1 Я считаю, что это просто-напросто неправильно. Бизнес-логика принадлежит модели, а не представлению ИЛИ контроллеру. Контроллеры должны быть очень простыми, по возможности RESTful. Для средств поиска, фильтров, записей по пользователю, что угодно, для всех этих моделей ответом являются именованные области и другие конструкции.

Michael Durrant 25.11.2011 15:13

Полностью согласен с Майклом Даррантом. Тонкие глупые контроллеры с толстыми, умными моделями (и добавление 4-го уровня для настойчивости) - это путь IMO.

Joe 01.12.2011 16:05

Вот как бы я это сделал. Он должен быть действителен практически на любом языке.

Представление инициирует вызов метода для метода OnView () контроллера, а затем отобразит все, что контроллер вернет ему (контролируемым образом, конечно ... Я думаю, что ваше представление будет содержать компонент видеоплеера, так что вы собираетесь получить какое-то видео с контроллера)

В вашем контроллере есть метод OnView (), который выполняет 3 вещи: создает экземпляр объекта Video (т. Е. Использует ваш уровень данных для получения объекта модели), вызывает метод updateViewCount () для объекта Video и отображает видео (возвращая предположительно объект Video для View).

Объект модели Video содержит данные, представляющие ваше видео и все необходимое, что вам нужно, включая updateViewCount (). Обоснованием этого является то, что количество просмотров видео имеет (агрегирование). Если «счетчик просмотров» должен быть сложным объектом, а не просто целым числом, пусть будет так. Ваш уровень данных, который создает видеообъекты из их примитивного представления на диске (база данных?), Также будет отвечать за загрузку и создание соответствующего объекта подсчета просмотров как часть создания видео.

Итак, это мои 0,02 доллара. Вы можете видеть, что я создал четвертую вещь (первые три - это модель, представление и контроллер), то есть уровень данных. Мне не нравится загрузка и сохранение объектов модели, потому что тогда они должны знать о вашей базе данных. Мне не нравятся контроллеры, выполняющие загрузку и сохранение напрямую, потому что это приведет к дублированию кода в контроллерах. Таким образом, отдельный уровень данных, к которому должны иметь прямой доступ только контроллеры.

В заключение, вот как я смотрю на представления: все, что делает пользователь, и все, что пользователь видит, должно проходить через представление. Если на экране есть кнопка с надписью «play», она не должна напрямую вызывать метод контроллера (во многих языках это не представляет опасности, но некоторые, например PHP, потенциально могут это допускать). Теперь метод "play" представления просто развернется и вызовет соответствующий метод на контроллере (которым в примере является OnView) и больше ничего не сделает, но этот уровень концептуально важен, хотя он функционально не имеет значения. Аналогичным образом, в большинстве ситуаций я бы ожидал, что ваше представление будет воспроизводить видеопоток, поэтому данные, возвращаемые контроллером в представление, будут потоком в формате, который требуется представлению, что не обязательно может быть вашим точным объектом модели (и добавлением этот дополнительный уровень развязки может быть рекомендован, даже если вы можете использовать объект Video напрямую). Это означает, что я могу заставить свой метод OnView принимать параметр, указывающий, какой формат видео я хочу вернуть, или, возможно, создать отдельные методы просмотра на контроллере для каждого формата и т. д.

Достаточно долго запыхался для тебя? : D Я ожидаю нескольких огорчений от разработчиков Ruby, которые, кажется, имеют несколько иное (хотя и не несовместимое) представление о MVC.

С MVC люди, похоже, не могут уместить четыре уровня в три.

Парадигма MVC правильно обращается к хранилищу данных в нет. И это «четвертый слой». Модель имеет обработку; но так как он также обращается к данным, программисты также помещают туда SQL. Неправильный. Создайте уровень абстракции данных, который является единственным местом, которое должно взаимодействовать с внутренним хранилищем. MVC должен быть DMVC.

О, это просто: модели. Только модели. :-)

staticsan 09.12.2008 05:38

Другие вопросы по теме