کار با Spring boot و drools -بخش1

یک Business Rule Management System یا به اختصار BRMS است. فریم ورک open source و جاوایی.این فریم ورک بیشتر زمانی استفاده می شود که مسئله، پروسه و منطق های خیلی پیچیده و پویا داشته باشید و گاهی در زمان اجرا برنامه ها بخواهید منطق ها و قوانین را تغییر دهید، بدون این که مجبور باشید کدها را تغییر دهید. حتی این تغییر می توتند توسط افراد غیر برنامه نویس هم انجام شود.(بهترین بخشش همینه) در واقع با تفکیک منطق برنامه از داده‌ها و سایر قسمت‌های پروژه کار می کند.داخل خودش یه Rule Engine (موتورهای قوانین کسب‌وکار) دارد که یکی از وظایفش، مدیریت و نظارت بر روی fact هاست. بهتره از Drools زمانی استفاده بشود که قوانین مدام در حال تغییر هستند و if-then زیادی در پروژه ها وجود دارد. ما تو Rule Engine می گویم که چه کاری رو انجام بده (What to Do) نه این که چه طوری انجامش بده (How to do it)این Rule Engine به دو صورت عمل می کند:روش استدلال پیش رو Forward Chaining ،که از داده ها شروع می کند و به نتیجه می رسد. یعنی با درنظر گرفتن داده های مربوط به موضوع مورد سوال، از if(اگر) ها شروع کرده و به نتایج یاthen(پس) های مناسب می رسد. به عبارت دیگر در Forward Chaining از مقدمات به نتایج می رسیم، روش دوم Backward Chaining است که از نتایج شروع می کند و برای نتایج مشخص به دنبال شرایط اولیه مناسب می گردد. به عبارت دیگر نقطه شروع then(پس) ها هستند و از آن ها به if(اگر) ها دست می یابد. روش اول استنتاج را روش مبتنی بر داده و روش دوم را روش مبتنی بر هدف می گویند.کلا برای کار با drools دو مرحله رو باید طی کنیم:1. تعریف قوانین که هم می تواند داخل فایلی با پسوند .drl بر اساس syntax تعریف شده اش باشد(یکم دانستن مفاهیم برنامه نویسی لازمه ) و یا داخل فایل اکسل .xls با tempalte مخصوصش، که اصطلاحا decision table یا جدول تصمیم گیری می گویند.(نیاز به دانش برنامه نویسی رو به صفر می رسونه و هر فردی با این کمک جدول تصمیم گیری می تونه به راحتی قوانین رو اضافه یا تغییر بده.)2. ایجاد فضای کاری و ساخت session مورد نظر و بعد اضافه کردن fact ها( که همون object های جاوا)و اجرای تمام قوانین.معادل مفاهیمکلا در صورتی که شرط برقرار بود، چه کاری انجام شود.When <Condition is true> Then <Take desired Action>بررسی فایل drl :package rules; import com.isc.mcb.model.Product; import com.isc.mcb.model.TypeEnum; import com.isc.mcb.NumberFormatException; global String hName; function String fTest(){....} rule &quotvalidate holiday&quot dialect &quotmvel&quot salience 5 when $h1 : Holiday( month == &quotjuly&quot ) then System.out.println($h1.name + &quot:&quot + $h1.month); end لغتPackage :تمام فایل های قوانین باید با package شروع شوند.(مسیر ذخیره شده فایل در پروژه است که باید در زیر پوشه resource باشد) قوانین پکیج ها در جاوا، برای rules ها (فای های قوانین)نیز صادق است. لغت Import : تمام Object های جاوایی که می خواهیم در Rules داشته باشیم را باید import کنیم. به این Object ها در فایل قوانین، fact گفته می شود. Fact/objectها باید قوانین pojo کلاس ها را داشته باشند.(شامل متد های setter/getter )لغت globals : در فایل های قوانین می توانیم متغیرهای globals نیز تعریف کنیم تا در همه ی قوانین تعریف شده در فایل، قابل دسترس باشد. این متغیر ها اجباری نیستند.(در فایل قوانین بیش از یک قانون نیز می توان تعریف کرد)عبارت functions : در صورتی که عملیاتی داریم که ممکن است در بیشتر قوانین اجرا شود بهتر است یک functions تعریف کنیم و در قوانین مختلف فراخوانی ایش کنیم.این بخش نیز اجباری نمی باشد.عبارت Rule Definition:شامل نام قانون، شرط و نتیجه آن می باشد. نام دیگر بخش when ، را LHS یا(left hand side) و بخش thenنیز RHSیا (right hand side) می گویند.در بخش then می توان از کلمات update و insert و retract نیز استفاده کرد. update (تغییر مقدار fact، باعث می شود rules engine از تغییر fact اگاه شود و امکان دارد سایر قوانینی که قبلا اجرا شده اند را نیز دوباره اجرا کند و باعث یه حلقه ی بی نهایت شود چون خود قانون update نیز دوباره اجرا می شود. بنابراین از no-loop در این قانون استفاده می شود تا جلوی حلقه ی بی نهایت را بگیرد. )، Insert (ایجاد یک factجدید در sessionجاری Rule Engine ) و Retract (اگر شرط خاصی در قانون صادق باشد و شما نخواهید بر روی fact جاری کار خاصی انجام دهید می توانید fact رو از Rule Engine پس بگیرید (retract) )لغت Dialect: تنها دو مقدار java و mvel را قبول می کند و به صورت پیش فرض بر روی جاوا قرار دارد. نوشتن کدهای جاوایی تنها در بخش then امکان پذیر است. امکان دسترسی به متد های set,get نیز به دلیل وجود همین لغت است.لغت Salience(اولویت بندی): ممکن است در فایل قوانین چندتا شرط قانون برای یکfact معتبر باشد در این حالت قانون ها به چه ترتیبی اجرا می شوند؟ در حالت کلی قوانین به صورت خودسرانه اجرا می شوند و هیچ ترتیبی ندارند، اما اگر ما بخواهیم بر اساس ترتیب خاصی اجرا شوند باید از Salience استفاده کنیم. Salience اعداد مثبت و منفی می گیرد. درواقع اعداد اولویت ها هستند بالاترین شماره یعنی بالاترین اولویت. به صورت پیش فرض مقدار Salience صفر است. در صورتی که چند قانون مقدار Salience یکسانی داشته باشند تنها می توانیم بگوییم باهم اجرا می شوند ولی ترتیب آنها مشخص نیست .تعریف متغیر: بهتر است در زمان تعریف متغیر از $ استفاده کنیم. اجباری وجود ندارد ولی باعث تمایز بین متغییر های کلاس جاوا و متغیر های قوانین می شود، در واقع خوانایی رو بالاتر می برد.عبارت activation-group(گروه بندی):جزء لغت های ذخیره شده فایل قوانین است و می تواند شامل یک قانون یا چند قانون باشد. قوانینی که در داخل گروه activation قرار دارند شبیه "if..else if..else" در زبان جاوا هستند بنابراین تنها یکی از این قوانین اجرا خواهد شد.(بالاتریت اولویت یا Salience اجرا می شود)در این پست به بررسی مفاهیم ، syntax و لغات رزرو شده در فایل های قوانین .drl پرداختیم. در پست بعدی ساختار جدول تصمیم گیری را بررسی می کنیم و با spring boot یک مثال ساده را پیاده سازی می کنیم.منابع هم از کلی سایت های مختلف(چه فارسی چه انگلیسی) بخش-2