MVC è un esercizio in Separazione delle preoccupazioni , un'architettura dell'interfaccia utente. È 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 che contengono e che i dati e il comportamento rimangono incapsulato . In pratica, un determinato oggetto OOP può o non può avere una logica che corrisponde ai suoi dati, o potrebbe non avere alcuna logica (un Dati Trasferisci oggetto , ad esempio).
In MVC, la logica aziendale va nel modello, non nel controller. Il controller è in realtà solo un intermediario per incollare la vista e il modello. Quindi nel modello, puoi avere dati e comportamenti nello stesso posto.
Ma anche questo accordo non garantisce una fusione rigorosa di dati / comportamenti. Gli oggetti contenenti solo dati possono essere gestiti da altre classi contenenti solo la logica, e questo è un uso perfettamente accettabile di OOP.
Ti darò un esempio specifico. Questo è un po 'forzato, ma diciamo che hai un oggetto Currency
, e quell'oggetto ha la capacità di rappresentarsi in qualsiasi valuta disponibile, ancorato 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 questo comportamento verrebbe incapsulato con l'oggetto Valuta.
E se volessi trasferire la valuta da un conto a un altro o depositare una certa valuta? Questo comportamento sarebbe anche incapsulato nell'oggetto Valuta? No, non lo farebbe. I soldi nel tuo portafoglio non possono trasferirsi dal tuo portafoglio nel tuo conto bancario; hai bisogno di uno o più agenti (un bancomat o un bancomat) per aiutarti a ottenere quei soldi nel tuo account.
Quindi quel comportamento sarebbe incapsulato in un oggetto Teller
, e accetterebbe Currency
e Account
oggetti come input, ma non conterrebbe alcun dato stesso, tranne forse un po 'di stato locale (o forse un oggetto Transaction
) per aiutare a elaborare gli oggetti di input.