En algunos proyectos MVC que he estado trabajando, se ha hecho evidente que hay algunos controladores problemáticos que han crecido orgánicamente en clases Dios - semidioses cada uno en su propio dominio, si se quiere.God Controllers - ¿Cómo prevenirlos?
Esta pregunta podría ser más una cuestión 'qué va donde,' pero creo que es una pregunta importante con respecto a SRP (Principio de Responsabilidad Individual), DRY (Do not Repeat Yourself), y mantener las cosas concisas, " ágil "- y no tengo suficiente experiencia (con este patrón y en el diseño general) para estar bien informado sobre esto.
En un proyecto, tenemos un NutritionController. Con el tiempo ha crecido para incluir estas acciones (muchas de ellas con su respectivo, GET, POST y DELETE métodos):
Index (home controller) ViewFoodItem AddFoodItem EditFoodItem DeleteFoodItem ViewNutritionSummary SearchFoodItem AddToFavorites RemoveFromFavorites ViewFavorites
Entonces tenemos un ExerciseController, que incluirá muchas acciones similares, como la búsquedas y acciones favoritas. ¿Deberían refactorizarse en su propio controlador para que sea algo así?
SearchController {
SearchExercise
SearchNutrition
//... etc
}
FavoritesController {
ViewNutritionFavorites
AddToNutritionFavorites
AddToExerciseFavorites
EditNutritionFavorites
EditExerciseFavorites
//... etc
}
apenas se parece a mí que si se rompe hacia fuera en controladores separados, vas a crecer una dependencia increíblemente grande en algún nivel para hacer frente a la información que se necesita. O va a tener una aplicación de manejo completamente genérica que será muy difícil de manejar, ya que tendrá que pasar por tantos aros para obtener el efecto deseado (ya sea en el nivel M, V o C).
estoy pensando en esto a mal? Por ejemplo, ¿debería tener un objeto genérico de Favoritos y luego dejar que el controlador decida a qué vista lanzarlo?
* Lo siento por deletreando las siglas - que estoy haciendo lo que en caso de que alguien más viene a través de esta pregunta y no tiene ni idea de lo que esas cosas son
EDIT: Toda la lógica es que realizo prácticamente manejado en las capas de servicio. Por ejemplo, el controlador enviará el 'nuevo' FoodItem al servicio. Si ya existe, o hay un error con él, el servicio lo enviará nuevamente al controlador.
Entonces, ¿repetiría las mismas cosas para los ejercicios o las agregaría a esos controladores? ES DECIR. ¿manejaría SearchController los métodos SearchExerciseItem, o sería otro controlador como SearchExerciseController? – MunkiPhD
Si así es como lo tiene configurado, la búsqueda es una acción en el controlador, no un controlador en este punto. Si la búsqueda fuera algo general, entonces podría ser su propio controlador. He modificado mi respuesta para reflejar esto. – Soviut
MVC trabaja con REST de forma muy natural: todos sus controladores "controlan" un único tipo de recurso y saben cómo realizar diversas acciones en ese recurso (es decir, responder a varios mensajes pasados a ese recurso), con asignación de clases de recursos REST. a los tipos de entidad de modelo de dominio principalmente uno a uno (ese es el punto de tener un modelo de dominio). – yfeldblum