A menudo, cuando diseño un programa con MVC, el controlador es inútil la mitad del tiempo.
Lo que quiero decir es esto: algo sucede en la vista (por ejemplo, un clic de botón). La vista luego notifica al controlador. El controlador luego delega directamente al modelo y no hace nada más porque no tiene nada que hacer.
Por ejemplo:
El usuario presiona el botón 'Color azul'> ver le dice al controlador controller.colorBlue()
> el controlador le dice al modelo model.colorBlue()
> el modelo colorea algo azul
En este ejemplo, el controlador parece inútil. No agrega nada. La vista bien podría haber hablado directamente con el modelo.
La otra mitad del tiempo, sin embargo, el controlador realiza algún tipo de mediación entre la vista y el modelo.
Mi pregunta es esta: ¿qué tan común es esto en las estructuras MVC? ¿Es razonable que la mitad del tiempo mi controlador parezca innecesario? ¿O es esto un problema? ¿Es esto común? ¿Cómo debería abordar esto?
Si mi pregunta no es lo suficientemente clara, dígalo.
fuente
controller.colorBlue()
realmente llamamodel.setColor(0, 0, 255);
. Una razón para la separación entre Modelo y Vista es que a menudo es el caso de que tenga múltiples elementos de IU para representar un solo estado en el modelo (por ejemplo, un elemento está marcado en el menú, la barra de herramientas está presionada y el puntero cambia a un relleno todo corresponde al campo de herramienta actualmente seleccionado en el modelo), con la separación MVC, el modelo no tendría que preocuparse por sincronizar los diferentes elementos de la interfaz de usuario.Respuestas:
Está subestimando la importancia de tener una capa de abstracción entre su interfaz de usuario y su modelo. El controlador cumple esta función el 100 por ciento del tiempo.
Tu ejemplo
model.colorBlue()
es un poco engañoso. En un modelo real, este probablemente sería un método CRUD. Por lo tanto, su botón podría ser un botón Crear cliente, su método de controlador seríaCreateCustomer()
y su Modelo seríaCreateCustomer()
. Claro, solo estás pasando la llamada.¿Pero qué pasa si necesita cambiar la forma en que funciona el modelo? Si su Vista llamaba directamente a su modelo, su aplicación se interrumpirá si cambia el Modelo. Los métodos del controlador proporcionan un "punto de acceso" para su Vista; puede hacer una modificación simple al método del controlador, tal vez cambiando la llamada del Modelo a
CreateCustomerWithVerification()
, y todo sigue funcionando.Se aplica el mismo razonamiento para tener una capa de servicio. En lugar de simplemente tener métodos CRUD en su modelo, debe tener acciones comerciales. De esa manera, mantiene la lógica de negocios fuera de sus controladores y hace posible usar el Modelo en otro lugar, tal vez en una aplicación WPF.
Piense en el controlador como un "patio de maniobras". Debería ser un intermediario, mediando solicitudes entre su UI y su Modelo, pero los métodos de controlador deberían tener la menor lógica posible.
fuente
Mientras codifica, podría pensar de esta manera:
En su caso, parece que está poniendo la lógica de dominio en el modelo y eso le causaría problemas si desea cambiarlo: tendrá que copiar métodos como "model.colorBlue" al nuevo modelo.
¿Y qué pasaría si cambia la definición de "azul"? Tendrás que cambiarlo 2 modelos. Además, en el controlador no debe escribir directamente en su base de datos, pero como Lie Ryan señaló , debe usar
model.setColor
.Lo mismo con las vistas. Si comienza a poner a la vista la lógica o la validación, si desea cambiar de vista, tendrá que copiar toda esa funcionalidad.
fuente