Бізнес-логіка в MVC [закрито]


184

У мене є 2 питання:

Q1. Де саме лежить «бізнес-логіка» у шаблоні MVC? Я плутаюся між Модель та Контролер.

Q2. Чи "бізнес-логіка" збігається з "бізнес-правилами"? Якщо ні, то в чому різниця?

Було б чудово, якби ви могли пояснити невеликим прикладом.

Відповіді:


173

Правила бізнесу йдуть у моделі.

Скажіть, ви показували електронні листи для списку розсилки. Користувач натискає кнопку "видалити" поруч із одним із електронних листів, контролер повідомляє модель про видалення запису N, а потім повідомляє про перегляд моделі, яку змінили.

Можливо, електронну пошту адміністратора ніколи не слід видаляти зі списку. Це ділове правило, що знання належать до моделі. Представлення може в кінцевому підсумку якось представляти це правило - можливо, модель виставляє властивість "IsDeletable", яке є функцією бізнес-правила, так що кнопка видалення у представленні вимкнена для певних записів - але саме правило не міститься у виду.

Ця модель в кінцевому рахунку є воротарем ваших даних. Ви повинні мати можливість перевірити свою логіку бізнесу, не торкаючись інтерфейсу.


5
Дякую за приклад. Чи не можемо ми керувати цим записом електронної пошти адміністратора (керуючи тим, чи можна його видалити чи ні), використовуючи наш контролер?
hmthur

2
@mud, що якщо ми поділимо нашу модель на ще два шари, тобто службовий рівень та сховище ... службовий рівень відповідає за бізнес-логіку, а сховище відповідає за рівень даних ...?
Дракон

3
@PeterMatisko "Моделі мають нести лише дані." Ви не розумієте, що означає "M" у "MVC". V - суто презентація. C - клей між презентацією та моделлю. (Насправді "VC" часто вважають разом як презентаційний шар, а популярні варіанти MVC, такі як MVVM - Model View Viewmodel - роблять це ще зрозумілішим.) M - це все інше : всі дані та логіка вашої заявки. Ви можете розділити дані та логіку бізнесу всередині цього шару, а частина даних цього шару можна назвати вашою "моделлю", але це не "М" у "MVC".
Грязь

1
@PeterMatisko "в laravel люди потім все кидають у контролери чи моделі. Погана погана архітектура". Погано як ? Бути специфічним. "V" означає "перегляд". Все, що не є видом, обов'язково йде в "М" або "С". "MVC просто недостатньо, він не говорить прямо про бізнес-логіку та куди її поставити" Звичайно, це так. "M" - це модель вашого додатка, яка представляє ваші дані, ділову логіку навколо нього, і все, і все інше, що не є презентацією. "V" і "C" - це презентаційний шар, введення та вихід користувача.
Грязь

2
@Mud Проблема полягає в тому, що laravel називає "Модель" просто носієм даних. Коли підручники говорять про те, що Laravel використовує MVC, і тоді ви бачите, що "Модель" має цілком конкретну мету, тоді ви не знаєте, де розмістити бізнес-логіку. І єдине розумне місце - це контролер, що не добре. Я цього не вигадую, я просто коментував типові проекти (і підручники), які я часто бачу.
Петро Матисько

191

Кулак всіх:
Я вважаю, що ви змішуєте схему MVC та принципи дизайну на основі n-ярусу.

Використання підходу MVC не означає, що вам не слід розшаровувати додаток.
Це може допомогти, якщо ви бачите MVC більше як розширення шару презентації.

Якщо ви помістите код непрезентації всередині шаблону MVC, ви дуже скоро можете скластися складний дизайн.
Тому я б запропонував перекласти свою бізнес-логіку в окремий бізнес-шар.

Подивіться лише на це: стаття Вікіпедії про багатоярусну архітектуру В

ній написано:

Сьогодні MVC та подібні моделі-перегляд-презентатори (MVP) - це розділення моделей дизайну концернів, які застосовуються виключно до презентаційного шару більшої системи.

У будь-якому випадку ... коли мова йде про корпоративну веб-програму, дзвінки з інтерфейсу користувача на рівень бізнес-логіки повинні розміщуватися всередині контролера (презентації).

Це тому, що контролер фактично обробляє виклики до певного ресурсу, запитує дані, здійснюючи виклики до бізнес-логіки та пов'язуючи дані (модель) з відповідним поданням.

Грязь сказала вам, що правила ведення бізнесу входять у модель.
Це теж правда, але він змішав (презентаційну) модель ('M' в MVC) та модель рівня даних в основі шару дизайну додатків.
Тож справедливо розміщувати правила ведення бізнесу, пов’язані з базою даних, у моделі (шарі даних) вашої програми.
Але не слід розміщувати їх у моделі вашого структурованого шару презентації MVC, оскільки це стосується лише конкретного інтерфейсу користувача.

Ця методика не залежить від того, чи використовуєте ви дизайн, керований доменом, або підхід, заснований на сценаріях транзакцій.

Дозвольте мені уявити це для вас:


Презентаційний шар: Модель - Вид - Контролер


Бізнес-рівень: Логіка домену - Логіка додатків


Рівень даних: сховища даних - рівень доступу до даних


Модель, яку ви бачите вище, означає, що у вас є додаток, який використовує MVC, DDD та рівень даних, що не залежать від бази даних.
Це загальний підхід до розробки більшого веб-додатку підприємства.

Але ви також можете зменшити його, використовуючи простий бізнес-рівень без DDD (бізнес-рівень без логіки домену) та простий рівень даних, який записується безпосередньо в певну базу даних.
Ви навіть можете скинути весь рівень даних та отримати доступ до бази даних безпосередньо з бізнес-рівня, хоча я не рекомендую.

Ось трюк ... Я сподіваюся, що це допоможе ...

[Примітка:] Ви також повинні бути в курсі того факту, що на сьогоднішній день у додатку існує більше ніж одна "модель". Зазвичай у кожного шару програми є своя модель. Модель шару презентації є специфічним для перегляду, але часто не залежить від використовуваних елементів управління. Бізнес-рівень може також мати модель, яку називають "доменна модель". Зазвичай це випадок, коли ви вирішили використовувати підхід, орієнтований на домен. Ця "доменна модель" містить як дані, так і бізнес-логіку (основна логіка вашої програми) і зазвичай не залежить від рівня презентації. Зазвичай презентаційний рівень викликає бізнес-рівень на певному "події" (натискання кнопки тощо) для зчитування даних або запису даних на рівень даних. У шару даних також може бути своя модель, яка, як правило, пов'язана з базою даних.

Питання: як це вписується в концепцію MVC?

Відповідь -> Це не так!
Ну - це ніби так, але не повністю.
Це тому, що MVC - це підхід, розроблений наприкінці 1970-х для мови програмування Smalltalk-80. На той час графічні інтерфейси та персональні комп'ютери були досить рідкісними, і всесвітня павутина навіть не була винайдена! Більшість сучасних мов програмування та IDE були розроблені у 90-х роках. На той час комп'ютери та користувальницькі інтерфейси були абсолютно іншими, ніж у 1970-х.
Ви повинні пам’ятати про це, коли ви говорите про MVC.
Мартін Фаулер написав дуже гарну статтю про MVC, MVP та сучасні графічні інтерфейси.


10
+1, щоб правильно вказати різницю між mvc та n-ярусною програмою. Більшість корпоративних програм, які я розробляю, мають n-рівень і використовують mvc лише як презентаційний шар.
Вийшов у відставку_сервіс

Скажемо 1) Перегляд моделей у MVC (презентаційний шар) 2) Деякі технології C # (бізнес-шар) для авторизованих транзакцій, основні логіки бізнес-правил. 3) Репозиторій та підрозділ роботи (рівень доступу до даних) Будь ласка, керуйтеся деякими технологіями (або найкращими практичними моделями), які можна використовувати для створення бізнес-шару, який повинен вільно дозволяти та виставляти модель, сховище для доступу від контролера в презентаційному шарі (верхній Шар). В основному я вважаю, додавання, видалення, оновлення та його поєднання як бізнес-логіка, і їх слід зберігати в розділі транзакції. Будь ласка, розкладіть про це додаткове світло.
Марк Макнейл Бікейо

Привіт Рахуле, якщо я правильно тебе зрозумів, то ти маєш рацію. Операції CRUD - це в основному атомні частини ділових транзакцій. Я особисто вважаю за краще використовувати потужний АБО-mapper, як Hibernate, як сховище, а не будувати власний. Це тому, що сплячка вже реалізує одиницю схеми роботи внутрішньо. Також я зазвичай вкладаю бізнес-операції в окремі бізнес-послуги.
Френк

Для моделі перегляду я можу навести вам наступний приклад: Просто зображення, у вас є графічний інтерфейс із переглядом подвійного списку. Цей перегляд подвійного списку використовує модель перегляду подвійного списку як свою модель даних. Ця модель даних є лише складом двох простих списків. Отже, модель з подвійним списком перегляду залежить від реалізації шару презентації, оскільки вона не є частиною вашої доменної моделі, на відміну від двох простих списків, які використовуються для створення моделі перегляду. Залежно від GUI, який ви хочете створити, існує кілька випадків, коли ви, можливо, захочете прив’язати конкретну модель перегляду до подання замість доменної моделі.
Френк

Бізнес-правила / логічна частина трохи складно пояснити. Для того, щоб почати будь-яку обробку даних, ви викликаєте метод з однієї зі своїх послуг. Це означає, що ви в основному починаєте транзакцію. Якщо цей метод містить логіку бізнесу, то його називають "сценарієм транзакцій". Зазвичай це погана річ, оскільки її навряд чи можна використовувати повторно. Було б краще, якби цей метод викликав бізнес-логіку вашої доменної моделі. Це означає, що модель домену повинна бути розроблена таким чином, щоб вона могла містити бізнес-логіку. Цей підхід, керований доменом, не працюватиме з неповною або неправильною моделлю домену.
Френк

73

Термін бізнес-логіка, на мій погляд, не є точним визначенням. У своїй книзі «Дизайн, керований доменом» Еванс розповідає про два типи бізнес-логіки:

  • Логіка домену.
  • Логіка застосування.

На мою думку, це розділення набагато чіткіше. І з усвідомленням того, що існують різні види ділових правил, також виникає усвідомлення того, що вони не обов'язково йдуть на одне і те ж місце.

Логіка домену - це логіка, яка відповідає фактичному домену. Отже, якщо ви створюєте облікову програму, то правила домену - це правила щодо облікових записів, проводки, оподаткування тощо. У спритному інструменті планування програмного забезпечення правила будуть такими, як обчислення дат випуску на основі швидкості та точок історії у відставанні, тощо.

Для обох цих типів застосувань імпорт / експорт CSV може бути актуальним, але правила імпорту / експорту CSV не мають нічого спільного з фактичним доменом. Цей вид логіки є логікою додатків.

Логіка домену, безумовно, переходить у шар моделі. Модель також відповідала б доменному шару в DDD.

Однак логіка програми не обов'язково повинна розміщуватися в шарі моделі. Це може бути розміщено безпосередньо в контролерах, або ви можете створити окремий рівень програми, на якому розміщені ці правила. Що найбільш логічно в цьому випадку, залежатиме від фактичного застосування.


1
Це дуже правда! Тут представлені дві моделі вашої моделі перегляду та моделі вашого домену. Я думаю, що майже прикро, що макет MVC-проектів змушує початківців розробників вважати, що вони повинні просто забити свій код у View Model.
Джонатан

1
Знайшов свою відповідь більш прийнятною та зрозумілою. Дякую.
revo

27

А1 : Бізнес-логіка бере Modelучасть у роботі MVC. Роль Modelполягає в тому, щоб містити дані та логіку бізнесу. Controllerз іншого боку, несе відповідальність за отримання входу користувачів і вирішення, що робити.

A2 : A Business Ruleє частиною Business Logic. Вони мають has aстосунки. Business Logicмає Business Rules.

Погляньте Wikipedia entry for MVC. Перейдіть до огляду, де згадується потік MVCвізерунка.

Подивіться також Wikipedia entry for Business Logic. Згадується, що Business Logicскладається з Business Rulesта Workflow.


16

Як було зазначено в парі відповідей, я вважаю, що є певне непорозуміння багаторівневої архітектури проти MVC.

Багаторівнева архітектура передбачає розбиття програми на рівні / шари (наприклад, презентація, бізнес-логіка, доступ до даних)

MVC - це архітектурний стиль для презентаційного шару програми. Для нетривіальних програм бізнес-логіка / ділові правила / доступ до даних не слід розміщувати безпосередньо в моделях, переглядах або контролерах. Для цього було б розміщення ділової логіки у вашому шарі презентації і, таким чином, зменшення повторного використання та збереження коду.

Модель є дуже розумним вибором для розміщення бізнес-логіки, але кращий / більш доцільний підхід полягає в тому, щоб відокремити свій презентаційний шар від рівня вашої бізнес-логіки та створити рівень бізнес-логіки та просто викликати рівень бізнес-логіки від ваших моделей, коли це необхідно. Рівень бізнес-логіки в свою чергу викликає рівень доступу до даних.

Я хотів би зазначити, що нечасто знайти код, який поєднує ділову логіку та доступ до даних в одному з компонентів MVC, особливо якщо програма не була архітектурована з використанням декількох ярусів. Однак у більшості корпоративних застосувань зазвичай ви знайдете багаторівневі архітектури з архітектурою MVC, розташованими всередині шару презентації.


2
Найкраща відповідь з цього питання. Слід проголосувати вище. Найгірша відповідь позначається як прийнята.
Петро Матисько

Найкраща відповідь .. без сумніву
сальман

Чи залежить це від розміру даних та програми? Щодо невеликого додатка, я здогадуюсь, вся логіка могла входити в моделі без будь-якої плутанини. Якщо так, то який поріг розміру потрібно почати розділяти на окремий шар?
mLstudent33

15

Це відповідь на запитання, але я дам свій "один цент":

Правила бізнесу належать до моделі. "Модель" завжди складається з (логічно чи фізично розділених):

  • модель презентації - це набір класів, який добре підходить для використання в режимі перегляду (він налаштований на певний інтерфейс користувача / презентацію),
  • модель домену - частина моделі, незалежна від інтерфейсу користувача, і
  • сховище - відома для зберігання частина "моделі".

Правила бізнесу живуть у доменній моделі, піддаються презентації у відповідній формі для представлення моделі "презентація" і іноді дублюються (або також застосовуються) у "рівні даних".


5

Немає сенсу вкладати свій бізнес-шар у модель для проекту MVC.

Скажіть, що ваш начальник вирішить змінити шар презентації на щось інше, ви б накрутили! Діловий шар повинен бути окремою збіркою. Модель містить дані, які надходять із бізнес-рівня, який переходить у представлення для відображення. Потім, наприклад, після публікації, модель прив'язується до класу Person, який знаходиться в бізнес-шарі і викликає PersonBusiness.SavePerson (p); де р - клас Особи. Ось що я роблю (клас BusinessError відсутній, але він також перейшов у BusinessLayer):введіть тут опис зображення


Ви б уточнили це твердження? " Модель містить дані, які надходять із бізнес-шару, який переходить до подання для відображення".
Ентоні Рутледж

2

Q1:

Логіку бізнесу можна розглядати у двох категоріях:

  1. Логіка домену, як контроль над адресою електронної пошти (унікальність, обмеження тощо), отримання ціни продукту за рахунок-фактура або, обчислення загальної ціни ShoppingCart на основі об'єктів продукту.

  2. Більш широкі та складні робочі процеси, які називаються бізнес-процесами, як контроль за процесом реєстрації студента (який, як правило, включає кілька кроків і потребує різних перевірок і має більш складні обмеження).

Перша категорія переходить в модель і другий один належить до контролера . Це тому, що випадки другої категорії - це широка логіка застосувань, і розміщення їх у моделі може змішати абстракцію моделі (наприклад, незрозуміло, чи потрібно нам ставити ці рішення в той чи інший клас моделі, оскільки вони пов'язані для обох!).

Дивіться цю відповідь для конкретного розмежування моделі та контролера, це посилання для дуже точних визначень, а також це посилання для приємного прикладу Android.

Справа в тому, що нотатки, згадані "Грязями" та "Франком" вище обох, можуть бути правдивими, як і "Пітом" (бізнес-логіка може бути розміщена в моделі або контролері відповідно до типу бізнес-логіки).

Нарешті, зауважте, що MVC відрізняється від контексту до контексту. Наприклад, в додатках для Android пропонуються деякі альтернативні визначення, які відрізняються від веб-базованих (див., Наприклад, цю публікацію ).


Q2:

Бізнес-логіка є більш загальною, і (як "дециклон", зазначений вище) ми маємо таке відношення між ними:

правила бізнесу ⊂ бізнес-логіка


0

Чому ви не введете рівень обслуговування. тоді ваш контролер буде худорлявим і читабельнішим, тоді всі ваші функції контролера будуть чистими діями. ви можете розкласти бізнес-логіку скільки завгодно, ніж вам потрібно в сервісному рівні. повторне використання коду - висота. не впливає на моделі та сховища.


-5

Модель = код для операцій з базою даних CRUD.

Controller = відповідає на дії користувача та передає користувачеві запити на отримання даних або видалення / оновлення до моделі відповідно до правил бізнесу, специфічних для організації. Ці бізнес-правила можуть бути реалізовані в допоміжних класах, або якщо вони не надто складні, просто безпосередньо в діях контролера. Нарешті, контролер просить перегляд оновити себе, щоб дати відгуку користувачеві у вигляді нового дисплея або повідомлення типу "оновлено, дякую" тощо.

View = інтерфейс користувача, який генерується на основі запиту на моделі.

Немає жорстких і швидких правил щодо того, куди мають дійти правила бізнесу. У деяких конструкціях вони переходять у модель, тоді як в інших вони включаються до контролера. Але я думаю, що краще тримати їх з контролером. Нехай модель турбується лише про підключення до бази даних.


Якщо ви ставите бізнес-правила в контролер і у вас багато, багато дій - ви збираєтесь повторювати ділове правило багато-багато разів? Ні. Ви будете відокремлювати його в хелперному методі чи в якомусь класі. Покладіть цю "річ" у модель, куди вона належить.
Г. Стойнев

3
MVC не є прикладною схемою для операцій з базою даних CRUD (хоча це може використовуватися таким чином), тому Model не може бути "кодом для операцій з базою даних CRUD". Модель визначає сутність програми, включаючи дані та правила ведення бізнесу. Контролер координує взаємодію між видом і моделлю. Представлення - це інтерфейс користувача, що розкриває модель, і доступні операції в моделях, відкритих контролером.
Джон Девіс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.