Представлення правил бізнесу за винятком


16

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

Інший підхід - це мати об'єкти зі статусом чи щось подібне

Чи є якийсь інший підхід? як ви ставитесь до цього?

Відповіді:


15

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

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


1
Саме так я поводжусь із цим у своїх додатках. Використання FluentValidation полегшує моє життя, а метод ValidateAndThrow врятує мені день.
Маттео Моска

У додатку інтерфейсу я погоджуюся повністю, але в додатку рівня обслуговування я створив би виняток, якби мені передали об’єкт, який не відповідає правилам бізнесу. Якщо ви використовуєте ці два у поєднанні, то іноді ви додаєте функцію перевірки або складну помилку, як описується matiasha в останньому реченні.
Білл

8
Накиньте виключення для домену . Це дозволяє розділяти між нашими та не-нашими вище.

@ Thorbjørn Ravn Andersen +1 Відмінне доповнення для "домену"
Джастін Омс,

1
@JamesPoulson, можливо, буде достатньо створити JamesPoulsonExceptionяк підклас, RuntimeExceptionа потім надати оригінальний виняток як cause. Потім можна просто сказати, if (exception instanceof JamesPoulsonException)... щоб розмежовуватись. Використовуйте getCause()метод, щоб дійти до вихідного винятку.

9

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

Використання винятків для забезпечення ділових правил не є гарною конструкцією.


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

8
@Fede: це питання розділення проблем. Користувальницький інтерфейс несе відповідальність за збір намірів користувача та повідомлення про відгуки з бізнес-рівня. Завдання бізнес-рівня - це аналіз інформації, зібраної користувальницьким інтерфейсом, її аналіз та або звітування назад в інтерфейс, і / або прохання рівня даних зберігати деякі дані. Між цими шарами має бути лише пухка муфта. Виняток становлять поганий, поганий підхід до з’єднання з нещільним зв'язком. Це не тільки означає обмін фактичними класами між шарами, але й викликає механізм, який покликаний вирішувати несподівані збої.
Адам Кросленд

@Adam - Добре сказано і точно.
Вальтер

1
@Adam - Не слідкуйте за вами, коли ви не вирішите проблеми. Я не очікую, що хтось із інтерфейсу користуватиметься CustomerNameInLowercaseException (будь ласка, я також сподіваюся, що виняток навіть не існує!). Ви можете просто обробити загальне ValidationException. Крім того, я на 100% з вами, що користувальницький інтерфейс повинен збирати лише інформацію, і все це. Що я казав раніше, це те, що незалежно від того, що ви робите в інтерфейсі користувача, BL не повинен вважати, що кожен вхід у порядку. Це просто якесь оборонне програмування.
Федес

@Fede: завдання бізнес-шару - гарантувати, що кожен ввід є нормальним. Якщо користувальницький інтерфейс робить це, то він реалізує бізнес-логіку. Тепер, якщо це той випадок, коли поле введення обмежуються цифрами і BL бачить літерні символи, по всім засобам кинути в виключення . Кожен раз, коли компонент отримує недійсні введення з іншого компонента, викидання виключення є логічним і правильним. Інтерфейс зламаний, а система зламана. Однак перевірка вхідних даних дуже відрізняється, ніж виконання ділової логіки. Дві дуже різні речі.
Адам Кросленд

5

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

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

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


1
Я погоджуюсь, винятки називаються винятками, оскільки їх не очікується. З іншого боку, застосування правил бізнесу у вашому рівні обслуговування, за винятком, не обов'язково є помилковим. Ви не розраховуєте, що він буде використаний, ви очікуєте, що клієнт може лише викликати операції та подавати лише дані, що відповідають дійсним умовам; але ви хочете створити шар захисту, оскільки ви знаєте, що в кодуванні клієнта можуть траплятися помилки. Начебто використання обмежень іноземних ключів у базі даних: ви очікуєте, що люди вставлять та оновлять дані правильно, але знаєте, що вони можуть вийти з ладу через помилку програмування.
Джеремі

2

вираження ділових правил - це одне, а їх реалізація - інше

подумайте про досвід користувача; якщо користувач не продавець, тому дати їм кнопку з написом «Створити рахунок» взагалі ?


1
Тільки тому, що ви не надаєте кнопку, це не означає, що вони все одно не відправлять вам повідомлення, щоб зробити щось. Подумайте, наскільки легкими будуть правила безпеки, якби це було все, що потрібно ..
jmoreno

Якщо користувачеві заборонено робити X, не дайте їм кнопки "Do X". Найкраща безпека - це незнання - не повідомляйте користувачеві про речі, які вони не можуть зробити;)
Стівен А. Лоу

1

Це повністю залежить від того, що робиться.

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

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

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


0

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

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

Однією з переваг, яка випливає з цього виду викидів винятків, є те, що вона дозволяє відокремлювати та використовувати повторно винятки попередників у кількох областях проекту. (Це суть орієнтованого на аспекти програмування.) Роблячи це, ви інкапсулюєте один конкретний аспект ваших загальних правил бізнесу в самостійний та підтримуваний компонент. Загалом ці компоненти відповідають 1-1 із викинутими повідомленнями про помилки. (Хоча іноді у вас буде один компонент, який викидає кілька різних винятків, майже ніколи не слід мати однаковий виняток, викинутий з кількох компонентів.)

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

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