MVC - это упражнение в разделении проблем , архитектуре пользовательского интерфейса. Это способ исправить сложность, которая может возникнуть в пользовательских интерфейсах из-за того, что презентация не отделена от контента .
Теоретически, все объекты могут иметь поведение, которое работает с данными, которые они содержат, и эти данные и поведение остаются инкапсулированными . На практике данный объект ООП может иметь или не иметь логику, которая соответствует его данным, или может вообще не иметь никакой логики ( например, объект передачи данных ).
В MVC бизнес-логика идет в модели, а не в контроллере. Контроллер действительно просто посредник, склеивающий вид и модель. Таким образом, в модели вы можете хранить данные и поведение в одном месте.
Но даже такое расположение не гарантирует строгого слияния данных и поведения. Объекты, содержащие только данные, могут работать с другими классами, содержащими только логику, и это совершенно приемлемое использование ООП.
Я приведу вам конкретный пример. Это немного надумано, но, допустим, у вас есть Currency
объект, и этот объект может представлять себя в любой доступной валюте, привязанной к доллару. Таким образом, у вас есть такие методы, как:
public decimal Yen { get { return // dollars to yen; } }
public decimal Sterling { get { return // dollars to sterling; } }
public decimal Euro { get { return // dollars to euro; } }
... и это поведение будет инкапсулировано с объектом Currency.
Но что если я захочу перевести валюту с одного счета на другой или внести некоторую валюту? Будет ли это поведение также инкапсулировано в объекте Currency? Нет, не будет. Деньги в вашем кошельке не могут быть переведены из вашего кошелька на ваш банковский счет; вам нужен один или несколько агентов (кассир или банкомат), чтобы помочь перевести эти деньги на ваш счет.
Таким образом, это поведение будет инкапсулировано в Teller
объект, и оно будет принимать Currency
и Account
объекты в качестве входных данных, но оно не будет содержать никаких данных, кроме, возможно, небольшого локального состояния (или, возможно, Transaction
объекта), чтобы помочь обработать входные объекты.