В нескольких проектах MVC, над которыми я работал, стало очевидно, что есть несколько проблематичных контроллеров, которые органично превратились в классы богов — полубогов, каждый в своей области, если хотите.
Этот вопрос может быть скорее вопросом «что и куда», но я думаю, что это важный вопрос в отношении SRP (принцип единой ответственности), DRY (не повторяйтесь) и сохранения краткости, «гибкости» — и я недостаточно опытен (с этим шаблоном и вообще с дизайном), чтобы разбираться в этом.
В одном проекте у нас есть NutritionController. Со временем он расширился и теперь включает следующие действия (многие с соответствующими методами GET, POST и DELETE):
Index (home controller) ViewFoodItem AddFoodItem EditFoodItem DeleteFoodItem ViewNutritionSummary SearchFoodItem AddToFavorites RemoveFromFavorites ViewFavorites
Затем у нас есть ExerciseController, который будет включать в себя множество подобных действий, таких как поиск и избранное. Должны ли они быть реорганизованы в свой собственный контроллер, чтобы это было примерно так?
SearchController {
SearchExercise
SearchNutrition
//... etc
}
FavoritesController {
ViewNutritionFavorites
AddToNutritionFavorites
AddToExerciseFavorites
EditNutritionFavorites
EditExerciseFavorites
//... etc
}
Мне просто кажется, что если разбить их на отдельные контроллеры, то на каком-то уровне вырастет невероятно большая зависимость для обработки информации, которая вам понадобится. ИЛИ у вас будет полностью универсальное приложение для обработки, с которым будет очень сложно справиться, поскольку вам придется прыгать через очень много обручей, чтобы получить желаемый эффект (либо на уровне M, V, либо C).
Я думаю об этом неправильно? Например, должен ли я иметь общий объект «Избранное», а затем позволить контроллеру решить, в какое представление его передать?
* Извините за расшифровку аббревиатур - я делаю это на случай, если кто-то еще столкнется с этим вопросом и не знает, что это за вещи.
EDIT: вся логика, которую я выполняю, в значительной степени обрабатывается на уровнях сервиса. Например, контроллер отправит службе «новый» объект FoodItem. Если он уже существует или с ним произошла ошибка, служба отправит его обратно на контроллер.