Можливо, це не найкраща ідея розглядати Rails як основний шаблон дизайну MVC. Зазначені рамки були зроблені з деякими притаманними недоліками (я, напевно, детально розробив це в іншій публікації ), і громада лише зараз почала вирішувати наслідки. Ви можете розглядати розробку DataMapper2 як перший важливий крок.
Якась теорія
Люди, які дають цю пораду, здається, уражені досить поширеною помилкою. Тож дозвольте мені розпочати, прояснивши це: Модель за сучасним шаблоном дизайну MVC НЕ є класом чи об’єктом.Модель - це шар.
Основною ідеєю шаблону MVC є Поділ проблем, а першим кроком у ньому є поділ між шаром презентації та шарами моделі. Подібно до того, як рівень презентації розпадається на контролери (екземпляри, що відповідають за введення користувачем), подання (екземпляри, що відповідають за логіку інтерфейсу) та шаблони / макети, так це робить і шар моделі.
Основними частинами, з яких складається шар моделі, є:
Об'єкти домену
Також відомий як доменні сутності, бізнес-об’єкти чи об’єкти моделі (мені не подобається це останнє ім’я, оскільки це лише додає плутанини). Ці структури люди зазвичай помилково називають "моделями". Вони відповідають за розміщення бізнес-правил (всю математику та перевірку для певної одиниці логіки домену).
Абстракції зберігання:
Зазвичай реалізується за допомогою шаблону зіставлення даних (не плутайте з ORM , які зловживали цією назвою). Зазвичай ці екземпляри мають завдання зберігати інформацію та отримувати її в об’єктах домену. Кожен об’єкт домену може мати декілька карт, так само як існує кілька форм зберігання (БД, кеш, сеанс, файли cookie, / dev / null).
Послуги:
Структури, що відповідають за логіку програми (тобто взаємодія між об’єктами домену та взаємодія між об’єктами домену та абстракціями сховища). Вони повинні діяти як "інтерфейс", за допомогою якого рівень презентації взаємодіє з шаром моделі. Зазвичай це те, що в Rails-подібному коді потрапляє в контролери.
Існує також кілька структур, які можуть бути в просторах між цими групами: DAO , одиниці роботи та сховища .
О ... і коли ми говоримо (в контексті Інтернету) про користувача, який взаємодіє з додатком MVC, це не людина. "Користувач" - це насправді ваш веб-браузер.
То як щодо божеств?
Замість того, щоб мати якусь страшну та монолітну модель для роботи, контролери повинні взаємодіяти зі службами. Ви передаєте дані від вводу користувача певній службі (наприклад, MailService
або RecognitionService
). Таким чином контролер змінює стан модельного рівня, але це робиться за допомогою чіткого API і не возитися з внутрішніми структурами (що може спричинити негерметичну абстракцію).
Такі зміни можуть або викликати негайну реакцію, або впливати лише на дані, які екземпляр подання вимагає від рівня моделі, або на обидва.
Кожна служба може взаємодіяти з будь-якою кількістю (однак, як правило, лише декількома) абстракцій об’єктів домену та сховища. Наприклад,RecogitionService
не могли б піклуватися про абстракції зберігання предметів.
Заключні примітки
Таким чином ви отримуєте додаток, яке можна протестувати на будь-якому рівні, має низький рівень зв’язку (якщо він правильно реалізований) і має чітко зрозумілу архітектуру.
Однак майте на увазі: MVC не призначений для невеликих додатків. Якщо ви пишете сторінку гостьової книги за шаблоном MVC, ви робите це неправильно. Ця схема призначена для забезпечення правопорядку у великомасштабних програмах.
Для людей, які використовують PHP як основну мову, ця публікація може бути актуальною. Це трохи довший опис шару моделі з кількома фрагментами коду.