Толстые модели, тонкие контроллеры и шаблон проектирования MVC

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

  • Толстые модели, худые контроллеры
  • Сохраняйте в моделях как можно больше бизнес-логики

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

Просматривая свои контроллеры, я теперь могу определить много логики, которая, вероятно, должна входить в модель:

  • В приложении есть списки, которые содержат элементы, и элементы можно ранжировать. Логика сортировки, которая помещает список в ранжированный порядок, находится в контроллере.
  • Точно так же предметы (модель предмета) также имеют изображения (модель изображения). Каждый элемент может иметь изображение по умолчанию (обозначенное image_id в таблице элементов). Когда элемент отображается с его изображениями, сначала должно появиться изображение по умолчанию. У меня есть логика, которая делает это в контроллере.
  • Когда отображается список, связанные списки отображаются на боковой панели. Логика определения связанных списков находится в контроллере.

Теперь к моим вопросам:

  1. С примерами, которые я привел выше, правильно ли я считаю, что это экземпляры логики в контроллере, который принадлежит модели?
  2. Какие еще области логики, общие для веб-приложений, должны входить в модели?
  3. Я уверен, что выявить эту проблему и изменить свой шаблон проектирования - это половина дела, но даже если я решу взять те примеры, которые я привел выше, и попытаться перенести эту логику в модель, я бы не знал, с чего начать. Может ли кто-нибудь указать мне в правильном направлении, разместив здесь код или сославшись на хорошие учебные ресурсы? Специальная помощь CakePHP была бы отличной, но я уверен, что всего MVC будет достаточно.

Обо всем этом слышал раньше :)

MeTitus 12.04.2013 17:34
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
75
1
12 285
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я использую по крайней мере эти два «теста», чтобы проверить правильность моей логики:

1) Если я напишу unittest, легко создать только один «настоящий» объект для тестирования (= объект, который вы используете в производстве) и не включать множество других, за исключением, возможно, некоторых объектов значений. Необходимость как фактического объекта модели, так и фактического объекта контроллера для выполнения теста может быть сигналом, что вам нужно переместить функциональность.

2) Задайте себе вопрос: что, если я добавлю еще один способ использования этих классов, мне нужно будет дублировать функциональность почти копипастом? ... Вероятно, это также хорошая причина для переноса этой функции.

тоже интересно: http://www.martinfowler.com/bliki/AnemicDomainModel.html

Ответ принят как подходящий

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

По крайней мере, с точки зрения CakePHP:

  1. да

  2. Все, что связано с данными или манипулированием данными, должно быть в модели. Что насчет простого метода find () с точки зрения CakePHP? ... Если есть шанс, что он сделает что-то «особенное» (например, вызовет определенный набор «условий»), который может вам понадобиться где-то еще, это хороший повод для обертывания внутри метода модели.

  3. К сожалению, никогда не бывает простого ответа, а рефакторинг кода - естественный процесс. Иногда просто просыпаешься и говоришь: «Святые макароны ... это должно быть в модели!» (ну, может, ты этого не делаешь, но у меня есть :))

Автор блога пишет победный ответ FTW!

Xeoncross 15.02.2012 02:33

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