Hola Alex,
en un MVC la diferencia básica es que el servicio encapsula la lógica de negocio de la aplicación (se rige por el patrón Facade) , mientras que el controlador lleva la lógica de manejo de la vista (leer parámetros, llamar a los servicios necesarios y redirigir/rellenar la vista correspondiente) .
Por ejemplo, tenemos una pequeña app web que calcula el máximo común divisor de 2 nºs
-tenemos una vista formularioEntrada que recibe 2 parámetro: 2 números naturales,
- el action del controlador de ese submit haría:
recoge los parámetros
rellena una variable llamando a una funcion "calculaMaximoComunDivisor" del servicio que nos calcula el máximo común divisor de esos 2 números
procesa la llamada a la vista de resultado con esa variable
- la función "calculaMaximoComunDivisor" de ese servicio en este caso recibiría 2 enteros, realizaría los cálculos pertinentes , y devolvería otro entero.
Como ves, desde el controlador no se conocen los detalles de implementación de la función. Y la función conoce dónde es utilizada . Esto puede suponer grandes ventajas:
Los action del controlador quedan más limpios. se dedican a recoger la entrada, invocar, preparar la salida.
Las funciones del servicio quedan mucho más límpias, sin operaciones de recogida/ relleno de parámetros por el medio.
Si necesito utilizar la función en varios puntos, las ventajas son evidentes
Puedo tener un equipo que programe la capa modelo, y otro la vista/controlador.
Al separar el modelo de la vista: puedo testearlo independientemente, puedo utilizarlo en múltiples vistas, etc.
Si encuentro una forma más óptima de realizar el calculaMaximoComunDivisor, puedo modificarlo siempre que se respete la firma.
...etc
Si encontramos una forma más óptima de hacer