MVC es un ejercicio de Separación de preocupaciones , una arquitectura de interfaz de usuario. Es una forma de acorralar la complejidad que puede ocurrir en las interfaces de usuario debido a que la presentación no se separa del contenido .
En teoría, todos los objetos pueden tener un comportamiento que opera en los datos que contienen, y esos datos y el comportamiento permanecen encapsulados . En la práctica, un objeto OOP dado puede o no tener una lógica que corresponda a sus datos, o puede no tener ninguna lógica (un objeto de transferencia de datos , por ejemplo).
En MVC, la lógica empresarial va en el modelo, no en el controlador. El controlador es realmente solo un intermediario para unir la Vista y el Modelo. Entonces, en el modelo, puede tener datos y comportamiento en el mismo lugar.
Pero incluso ese arreglo no garantiza una fusión estricta de datos / comportamiento. Los objetos que contienen solo datos pueden ser operados por otras clases que contienen solo lógica, y este es un uso perfectamente aceptable de OOP.
Te daré un ejemplo específico. Esto es un poco artificial, pero supongamos que tiene un Currency
objeto, y ese objeto tiene la capacidad de representarse a sí mismo en cualquier moneda disponible, vinculada al dólar. Entonces tendrías métodos como:
public decimal Yen { get { return // dollars to yen; } }
public decimal Sterling { get { return // dollars to sterling; } }
public decimal Euro { get { return // dollars to euro; } }
... y ese comportamiento se encapsularía con el objeto Moneda.
Pero, ¿qué sucede si quisiera transferir la moneda de una cuenta a otra o depositar alguna moneda? ¿Ese comportamiento también se encapsularía en el objeto Moneda? No, no lo haría. El dinero en su billetera no puede transferirse de su billetera a su cuenta bancaria; necesita uno o más agentes (cajero o cajero automático) para ayudarlo a ingresar ese dinero en su cuenta.
Por lo que el comportamiento se encapsula en un Teller
objeto, y que aceptaría Currency
y Account
objetos como entradas, pero no contendría ningún dato en sí, excepto tal vez un poco de estado local (o tal vez un Transaction
objeto) para ayudar a procesar los objetos de entrada.