MVC è un esercizio di Separation of Concerns , un'architettura UI. È un modo per correggere la complessità che può verificarsi nelle interfacce utente a causa della presentazione non separata dal contenuto .
In teoria, tutti gli oggetti possono avere un comportamento che opera sui dati in essi contenuti e che dati e comportamento rimangono incapsulati . In pratica, un determinato oggetto OOP può o meno avere una logica che corrisponde ai suoi dati o potrebbe non avere alcuna logica ( ad esempio un oggetto di trasferimento dati ).
In MVC, la logica aziendale va nel modello, non nel controller. Il controller è davvero solo una via di mezzo per incollare insieme la vista e il modello. Quindi, nel modello, puoi avere dati e comportamento nello stesso posto.
Ma anche tale accordo non garantisce una fusione rigorosa di dati / comportamenti. Gli oggetti che contengono solo dati possono essere gestiti da altre classi contenenti solo la logica, e questo è un uso perfettamente accettabile di OOP.
Ti faccio un esempio specifico. Questo è un po 'inventato, ma supponiamo che tu abbia un Currency
oggetto, e quell'oggetto ha la capacità di rappresentarsi in qualsiasi valuta disponibile, ancorata al dollaro. Quindi avresti metodi come:
public decimal Yen { get { return // dollars to yen; } }
public decimal Sterling { get { return // dollars to sterling; } }
public decimal Euro { get { return // dollars to euro; } }
... e quel comportamento sarebbe incapsulato con l'oggetto Valuta.
E se volessi trasferire la valuta da un conto a un altro o depositare una valuta? Tale comportamento verrebbe anche incapsulato nell'oggetto Valuta? No, non lo farebbe. Il denaro nel tuo portafoglio non può trasferirsi dal tuo portafoglio al tuo conto bancario; hai bisogno di uno o più agenti (un cassiere o un bancomat) per aiutarti a ottenere quei soldi sul tuo conto.
Quindi quel comportamento sarebbe incapsulato in un Teller
oggetto, e accetterebbe Currency
e Account
oggetti come input, ma non conterrebbe alcun dato stesso, tranne forse un po 'di stato locale (o forse un Transaction
oggetto) per aiutare a elaborare gli oggetti di input.