Товсті моделі Vs. Бізнес-логіка, Де ви розмежуєте?


16

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

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

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


tl; dr: Які речі можуть або повинні бути використані методом у картографованому класі при використанні ORM, а що слід залишати, щоб жити в іншому шарі абстракції?


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

Відповіді:


10

Я з тобою переважно; ваш колега, здається, сперечається або за анемічну модель домену антипаттерн, або за дублювання моделі в "моделі стійкості" без очевидної вигоди (я працюю над проектом Java, де це було зроблено, і це велика головна біль у ремонті, як це означає тричі більше роботи, коли щось змінюється в моделі).

Які речі можуть або повинні застосовуватися методом у картографованому класі при використанні ORM, а що слід залишати, щоб жити в іншому шарі абстракції?

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


+1, для другої частини вашої відповіді. Що стосується першої частини, я впевнений, чому ви говорите, що анемічна модель домену вимагає такої «додаткової» роботи у разі змін. Я розумію, що зміни відбудуться будь-яким способом, але в декількох різних класах (що це погано), але це майже однакова кількість змін; Я вважаю?
NoChance

1
@Emmad Kareem: У коментарі йшлося про наявність стійкості та доменних моделей. Додавання властивості до моделі потім вимагає додавання її до двох модельних класів (а не до одного), а також до будь-яких карт між ними (це теоретично може бути автоматичним, але зазвичай той, хто вважав, що було б гарною ідеєю мати окремий "модель стійкості" вирішує виправдати це розділення, зробивши їх різними, наприклад, мати типи даних, які більше відповідають моделі типу DB), так що це в 2 + X рази більша кількість змін, причому X змінюється від 0 до години втраченої продуктивності через неясні питання картографування.
Майкл Боргвардт

3

Це виклик судження, який дійсно залежить від очікуваного розміру та масштабу того, що ви розробляєте. Найбільш жорсткий підхід - обмежити типи ORM компонентом доступу до даних та використовувати POCO в загальній бібліотеці як типи, на які посилаються та використовуються всіма рівнями. Це дозволило б надалі мати фізичну розлуку, а також логічну поділ. Ви також можете вирішити, що між інтерфейсом користувача та рівнем бізнес-логіки повинен існувати додатковий шар. Зазвичай це називається шаром фасаду або бізнес-інтерфейсу. У цьому додатковому шарі живе ваш код використання. Індивідуальний слабко пов'язаний код викликається шаром Facade / BI (наприклад, у Facade є функція ProcessOrder (), яка запускає бізнес-логіку 1: M разів для виконання всіх кроків, необхідних для фактичної обробки замовлення).

Однак, все, що сказано: багато разів ця кількість архітектури є просто непотрібною надмірністю. Наприклад, кодуйте спеціально для простого веб-сайту, де ви не маєте наміру упакувати його компоненти для повторного використання. Цілком справедливо створити веб-сайт MVC та використовувати об'єкти EF для такого типу рішення. Якщо пізніше сайт потребує масштабування, ви можете розглянути питання про кластеризацію чи процес, який часто втрачається, що називається "рефакторинг".


3

Просто нагадайте своєму колезі, що вам не потрібно перебільшувати моделі, ніби це проект Java. Я маю на увазі порівняння двох стійких об'єктів - це поведінка, але це не визначено шаром стійкості. Отже, питання 6 пива: чому взагалі абсолютно не пов’язані класи, що описують щось одне й те саме? Впевненість, стійкість є досить важливим аспектом моделі, яку слід розглядати окремо, але недостатньо, щоб гарантувати, щоб вона ставилася до всього іншого. Якщо ви керуєте автомобілем, миєте його чи перебираєте його, ви весь час керуєте автомобілем.

То чому б просто не скласти всі ці різні аспекти в єдиний модельний клас? Вам потрібна купа методів класу, що стосуються збережених об'єктів - розмістіть їх в одному класі; у вас є маса методів екземплярів, що займаються валідацією - поставте їх в інший. Нарешті, змішайте два і вуаля! Ви отримали собі розумне, усвідомлене та повністю вміщене модельне представлення саме там.


1

Окрім інших відповідей, зверніть увагу на приховані застереження при використанні багатих моделей домену з ORM.

У мене виникли проблеми введення поліморфних служб у класи збережених моделей, коли я намагався досягти чогось такого типу псевдокоду:

Person john = new Person('John Doe')
Organisation company = organisation_repository.find('some id')
Employee our_collegue_john = company.hire(john)

У цьому випадку Організація може вимагати: HRService залежність конструктора (наприклад). Зазвичай ви не можете легко контролювати інстанціювання своїх модельних класів під час використання ORM.

Я використовував Doctrine ORM та службовий контейнер від Symfony. Мені довелося маніпулювати ОРМ не надто елегантним способом і не було іншого вибору, як розділити стійкість та ділові моделі. Я ще не пробував з sqlachemy, подумав. Python може виявитись більш гнучким, ніж PHP для цього матеріалу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.