Това е версията на публикацията в блога на лекция, която изнесох на ClojureX 2018. Ако имате 15 свободни минути, можете да видите светкавичната беседа тук, в противен случай прочетете нататък!

Този блог ще покрие 4 основни точки:

  1. Въведение в Clara и механизмите за правила

2. Кога да ги използвате

3. Кога не трябва да ги използвате

4. Извличане на най-доброто от парадигмата

Изходният код, използван за тази публикация, е с отворен код в Github тук. Добавих още малко четиво относно правилата на Clara в Readme и ако искате да научите повече, моля, добавете още правила и отворете заявка за изтегляне! Добавих куп тестове към моите предположения за проверка и насърчавам разбирането. Намерих много малко примери за тестове за машини за правила, така че се надявам това да се окаже полезно.

1. Въведение в Clara и двигатели с правила

Лесна настройка

Clara е просто още една зависимост, която може да бъде добавена към вашия файл project.clj.

Какво представляват правилата?

Нека обясним как работят правилата на Клара чрез пример. Вие сте съквартирант в къща, която награждава своите съквартиранти, които завършват задълженията си с бира. Има три основни домашни правила:

„Само ако сте свършили четирите си задължения, имате право да изпиете бира“🍺

„Нашите чистачи почистватбаня,всекидневна и кухня“😜

„Ако си болен, няма да получиш бира!“ 🤕

Тук имаме поредица от твърдения на истината. Правилата на Clara също работят с твърдения за истина - които са нейните правила. Това не са нищо повече от проста условна конструкция ако-тогава. Например:

Ако сте свършили 4 задачи ⇒ имате право на бира

Ако наемете чистачи да вършат домакинска работа ⇒ те ще вършат 3 домакински задължения: баня, всекидневна, кухня

Ако сте болни ⇒ сте освободени от пиенето на бира

Едно правило

Правилото на Клара работи по подобен начин. От лявата страна фактите се сравняват с условията. Ако дадено условие е изпълнено, то ще премине към проверка на следващото условие. Ако всички условия са изпълнени, правилото се активира и се задейства от двигателя. Задействането на правило ще изпълни действието отдясно, обикновено вмъкване или отмяна на факт.

Тук е важно да се отбележи, че има само условието If/Then, няма друго: ако дадено условие не е изпълнено, правилото няма да бъде активирано.

Няколко правила

Вътре в двигателя правилата се оценяват спрямо набор от данни, наречен работна памет. Машината знае само за това, което е в работната памет, няма да прави заявки в DB, ​​да чете файлове или да извиква API. Ако са необходими данни за оценяване на правила, те трябва да бъдат въведени от самото начало.

Само правила могат да манипулират работната памет. Следователно няма странични ефекти от извикването на правило. Едно от основните предимства, което носи това, е поддържането на истината. Ако условията за вмъкване на правило станат неверни, тогава вмъкнатият факт вече не се поддържа и Clara автоматично го оттегля от сесията.

По този начин правилата могат да взаимодействат с други правила, за да изразят по-сложна условна логика. Работата на машината за правила е да оцени набор от правила спрямо някакво първоначално състояние на работната памет

Накратко основният алгоритъм за правилата е:

  • Намерете правила с изпълнени всички условия от лявата ръка, т.е. активирани
  • Задействайте едно от тези активирани правила
  • След това, ако правилата все още са активирани, повторете от стъпка 1

Механизмът на правилата спира, когато нищо не може да се активира.

2. Кога да ги използвате

Управление на сложността

Правилата на Clara могат да бъдат полезни, когато „управлявате сложна, потенциално непостоянна, „бизнес логика““ — „Майк Родригес“. Това често се изразява в преплетени, повтарящи се изявления, което води до прекарване на много време в бърникане с условни изрази и добавяне на специални предпазители на други места.

Други предимства също включват възможността да се разделят правилата от заявките и по този начин да се даде възможност за разделяне на проблемите.

Условен пример

Ето един пример за нашите плоски задължения като условно изявление. В този извадка има проверка, за да се види дали четири задължения са изпълнени от съквартирант, ако са, тогава отговарят на условията за бира.

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

Проблемът, който се въвежда тук, е, че трябва да се грижите за реда. Ако променим реда и имаме това второ условие преди предишното, тогава нашата логика ще бъде неправилна.

Разглеждайки условния оператор като цяло, ако трябва да добавим допълнителни правила, става ясно, че той започва да става много тромав и бързо придобива сложност. Също така не е идеално да продължавате да добавяте ключове и стойности към структура от данни и да ги предавате наоколо. Не е много четлив, тъй като е трудно да се разберат правилата само от кода.

Пример за двигател на Clara rules

Сега нека да разгледаме как биха изглеждали задълженията на съквартиранта, ако се прилагат с помощта на правилата на Клара.

От лявата страна (преди стрелката) създаваме поредица от условия. Първо свързваме даденото име на Flatmate с променливата ?name, след което броят на задълженията, извършени от този съквартирант, се отчита от факта Chore и неговият номер се свързва с?c променлива, чиято стойност трябва да е по-голяма от 3. Ако е по-голяма от 3, тогава името и броят се вмъкват във факта CompletedChore, който по-късно може да бъде поискан.

Разглеждайки правилото за чистачки, очевидно предимство от използването на правилата на Clara е тяхната четливост. Това се чете точно като правилото, което представлява.

За разлика от условното твърдение, могат да се добавят много повече правила и условната сложност се увеличава, като същевременно се запазват четливи твърдения на истината. Създаден е по-ясен език на домейна, тъй като фактите показват точките от данни, които ни интересуват, напр. Задачи, изключения, завършени задължения.

Друго предимство е, че редът тук няма значение и поддържането на истината се отчита.

Няма нужда да се предава голямо петно ​​от структура от данни, за да се актуализира в една функция или множество функции. Вместо това по-богати стратегии за работа със сложна логика: напр. булеви стойности, изведените истини могат да се използват за лесно увеличаване на сложността на двигателя, без да засягат другите около тях.

Фактите - като например дали съквартирант отговаря на условията за бира или не - могат да бъдат запитвани отделно и да поддържат разделение между логиката на бизнес правилата и запитването за резултатите от тях.

Можете да поискате всеки друг факт, без да променяте или преизчислявате нищо.

3. Кога да не ги използвате

Машината за правила няма да бъде добър избор, когато има проста бизнес логика, която е малко вероятно да се усложни и чиито условия могат да бъдат адекватно обработени от if/else изрази.

4. Извличане на най-доброто от парадигмата

Ето няколко анти-модели, които трябва да избягвате, когато използвате правилата на Clara.

Не ги програмирайте като функции

  • Стремете се към много малки записи, правила и заявки, за разлика от дългите функции

Не ги пишете като изрази if/else

  • Ползата от парадигмата е разделяне на проблемите
  • Ако изглеждат като if/else- вашият проблем достатъчно сложен ли е, за да оправдае използването на правила?

Алгебра на лоста!

  • Бъдете стратегически в начина, по който създавате условия, например можете да проверите за липса на факт, който да отговаря на критерии за правило (:not Exemption ?name).