MVC - вправа розділення проблем , архітектури інтерфейсу. Це спосіб вирішити складність, яка може виникнути в інтерфейсах користувача через те, що презентація не відділяється від контенту .
Теоретично всі об'єкти можуть мати поведінку, яка діє на даних, які вони містять, і дані та поведінка залишаються в капсулі . На практиці даний об'єкт OOP може мати або не мати логіку, яка відповідає його даним, або взагалі не мати будь-якої логіки ( наприклад, Об'єкт передачі даних ).
У MVC бізнес-логіка йде в моделі, а не в контролері. Контролер насправді є лише проміжним з’єднанням, щоб склеїти Погляд та Модель. Тож у моделі ви можете мати дані та поведінку в одному місці.
Але навіть така домовленість не гарантує суворого злиття даних / поведінки. Об'єктами, що містять лише дані, можна керувати іншими класами, що містять лише логіку, і це цілком прийнятне використання OOP.
Наведу конкретний приклад. Це трохи надумано, але скажімо, у вас є 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; } }
... і ця поведінка буде інкапсульована об'єктом валюти.
Але що робити, якщо я хотів перевести валюту з одного рахунку на інший або депозитувати якусь валюту? Чи така поведінка також буде інкапсульована в об'єкт Валюта? Ні, не буде. Гроші у вашому гаманці не можуть перераховуватися з гаманця на ваш банківський рахунок; вам потрібен один чи більше агентів (касир чи банкомат), щоб допомогти отримати гроші на ваш рахунок.
Таким чином, така поведінка буде інкапсульована в Teller
об'єкт, і вона буде приймати Currency
і Account
об'єкти як вхідні дані, але вона не міститиме жодних даних, за винятком, можливо, трохи місцевого стану (або, можливо, Transaction
об'єкта), який допоможе обробити вхідні об'єкти.