{"id":2377,"date":"2016-04-21T13:47:23","date_gmt":"2016-04-21T11:47:23","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=2377"},"modified":"2023-08-16T12:15:58","modified_gmt":"2023-08-16T10:15:58","slug":"jboss-drools-wprowadzenie-do-silnikow-regulowych-cz-1","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/jboss-drools-wprowadzenie-do-silnikow-regulowych-cz-1\/","title":{"rendered":"JBoss Drools: wprowadzenie do silnik\u00f3w regu\u0142owych &#8211; cz.1"},"content":{"rendered":"\n<p>Niemal ka\u017cda wi\u0119ksza organizacja przechowuj\u0105ca i przetwarzaj\u0105ca dane na potrzeby w\u0142asnej dzia\u0142alno\u015bci, bez wzgl\u0119du na domen\u0119 tych danych, pr\u0119dzej czy p\u00f3\u017aniej b\u0119dzie musia\u0142a stawi\u0107 czo\u0142a nast\u0119puj\u0105cemu problemowi \u2013 jak w spos\u00f3b efektywny zaimplementowa\u0107 i utrzymywa\u0107 biznesow\u0105 wiedz\u0119 w <a href=\"http:\/\/sii.pl\/offer-page\/infrastruktura-it\/\">systemach IT<\/a>. W miar\u0119 rozbudowy bazy wiedzy i procedur biznesowych, mo\u017ce si\u0119 okaza\u0107, \u017ce klasyczne podej\u015bcie wykorzystuj\u0105ce repozytorium danych i zaimplementowane procesy agreguj\u0105ce w sobie biznesow\u0105 logik\u0119, b\u0119dzie niewystarczaj\u0105ce. R\u00f3\u017cne klasy system\u00f3w mog\u0105 wyj\u015b\u0107 naprzeciw oczekiwaniom zar\u00f3wno administrator\u00f3w technicznych jak i u\u017cytkownik\u00f3w biznesowych, oczekuj\u0105cych bardziej elastycznego rozwi\u0105zania umo\u017cliwiaj\u0105cego im zarz\u0105dzanie t\u0105 wiedz\u0105 bez konieczno\u015bci ka\u017cdorazowej rozbudowy programistycznej wykorzystywanych narz\u0119dzi. Okazuje si\u0119, \u017ce rozwi\u0105zania zbudowane w oparciu o silnik regu\u0142owy potrafi\u0105 bardzo dobrze zaadresowa\u0107 wi\u0119kszo\u015b\u0107 bol\u0105czek organizacji staj\u0105cej przed tym problemem. Zw\u0142aszcza, \u017ce w ostatnim okresie gotowe rozwi\u0105zania osi\u0105gn\u0119\u0142y naprawd\u0119 du\u017c\u0105 dojrza\u0142o\u015b\u0107 technologiczn\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Klasyfikacja silnika regu\u0142owego<\/h2>\n\n\n\n<p>Definicja i szczeg\u00f3\u0142owy opis funkcjonalny silnika regu\u0142owego znajduje si\u0119 w dalszej cz\u0119\u015bci tego artyku\u0142u, jednak warto w tym miejscu nadmieni\u0107, do jakiej klasy system\u00f3w zaliczaj\u0105 si\u0119 narz\u0119dzia oparte o tego typu rozwi\u0105zania i jak wpasowuj\u0105 si\u0119 w korporacyjn\u0105 architektur\u0119 systemow\u0105. Historycznie prekursorami dzisiejszych silnik\u00f3w regu\u0142owych s\u0105 rozwi\u0105zania, kt\u00f3re powsta\u0142y jako jeden z element\u00f3w pracy nad sztuczn\u0105 inteligencj\u0105, kiedy usilnie poszukiwano sposob\u00f3w na nauczenie maszyn my\u015blenia i wyci\u0105gania samodzielnych wniosk\u00f3w. Lekko zmodyfikowane podej\u015bcie do tego zagadnienia znajduje zastosowanie w obszarze Business Intelligence jako uzupe\u0142nienie dla narz\u0119dzi wspieraj\u0105cych zasilanie, transformacje i przechowywanie danych oraz ich prezentacj\u0119 (np. w postaci raport\u00f3w). A zatem silnik regu\u0142owy mo\u017cna sklasyfikowa\u0107 jako narz\u0119dzie z obszaru Data Management, system wykorzystuj\u0105cy silnik regu\u0142owy mo\u017ce natomiast by\u0107 zar\u00f3wno zintegrowanym komponentem platformy BI, jak i osobnym systemem uruchomionym niejako \u201eobok\u201d system\u00f3w transakcyjnych (np. CRM) i z nimi zintegrowanym.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Co to jest silnik regu\u0142owy<\/h2>\n\n\n\n<p>Trzymaj\u0105c si\u0119 jednej z najprostszych definicji, silnik regu\u0142owy to system (lub komponent systemu) informatyczny umo\u017cliwiaj\u0105cy uruchamianie regu\u0142 biznesowych w \u015brodowisku produkcyjnym. Regu\u0142y nale\u017cy w tym kontek\u015bcie rozumie\u0107 jako wyra\u017cenia odpowiadaj\u0105ce zdaniom warunkowym: <em>je\u017celi x to y<\/em>, opisuj\u0105ce pewn\u0105 logik\u0119 i procedury biznesowe, zbudowane w oparciu o repozytorium wiedzy lub pojawiaj\u0105ce si\u0119 w systemie zdarzenia. Regu\u0142y mog\u0105 by\u0107 oczywi\u015bcie bardziej z\u0142o\u017cone, mog\u0105 by\u0107 tak\u017ce od siebie nawzajem zale\u017cne albo zdefiniowane jako powi\u0105zane i prawdziwe tylko jako warunek zbiorczy, etc. Uruchamianie regu\u0142 to z kolei powtarzalny proces weryfikacji odpowiadaj\u0105cych im warunk\u00f3w w danym \u015brodowisku. Nale\u017cy w tym miejscu zaznaczy\u0107, \u017ce produktem uruchomienia regu\u0142 biznesowych s\u0105 na og\u00f3\u0142 nowe fakty umieszczane w repozytorium wiedzy. Silnik regu\u0142owy z zasady nie wykonuje \u017cadnych dodatkowych operacji na podstawie tych nowych fakt\u00f3w (chocia\u017c mo\u017cna w oparciu o nie zbudowa\u0107 kolejne regu\u0142y biznesowe), pozostawiaj\u0105c programi\u015bcie decyzj\u0119 co do ich interpretacji i dalszej obs\u0142ugi.<\/p>\n\n\n\n<p>Warto w tym miejscu wspomnie\u0107, \u017ce silniki regu\u0142owe na og\u00f3\u0142 rozr\u00f3\u017cniaj\u0105 dwa typy regu\u0142 biznesowych (kt\u00f3re zosta\u0142y ju\u017c wst\u0119pnie naszkicowane), a co za tym idzie mog\u0105 pracowa\u0107 jednym z dw\u00f3ch tryb\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wnioskowanie \u2013 czyli tryb, w kt\u00f3rym w repozytorium wiedzy przechowywane s\u0105 fakty a na nich zdefiniowane s\u0105 regu\u0142y biznesowe. Ka\u017cda zmiana regu\u0142 skutkuje konieczno\u015bci\u0105 ponownego uruchomienia mechanizmu wnioskowania, co w efekcie mo\u017ce przynie\u015b\u0107 inne rezultaty. Samo repozytorium fakt\u00f3w nie jest z kolei zasilane nowymi danymi na bie\u017c\u0105co, a raczej w trybie cyklicznego importu.<\/li>\n\n\n\n<li><u>Przyk\u0142ad: <\/u>Firma telekomunikacyjna zdecydowa\u0142a si\u0119 wprowadzi\u0107 promocj\u0119 (rabat) dla klient\u00f3w, kt\u00f3rzy zakupili co najmniej jeden produkt z ka\u017cdego z trzech r\u00f3\u017cnych typ\u00f3w oferowanych przez t\u0119 firm\u0119. W repozytorium fakt\u00f3w znajduj\u0105 si\u0119 informacje o produktach posiadanych przez klient\u00f3w. Je\u017celi do repozytorium wprowadzimy now\u0105 regu\u0142\u0119 biznesow\u0105, okre\u015blaj\u0105c\u0105, \u017ce w przypadku znalezienia na danym kliencie jednego lub wi\u0119cej produkt\u00f3w dla ka\u017cdego z trzech typ\u00f3w, to po uruchomieniu wnioskowania w repozytorium pojawi\u0105 si\u0119 nowe fakty \u2013 ka\u017cdy z nich b\u0119dzie okre\u015bla\u0142 klienta, kt\u00f3ry kwalifikuje si\u0119 do tej promocji. Je\u017celi warunki promocji si\u0119 zmieni\u0105 i zmodyfikowana zostanie regu\u0142a biznesowa w repozytorium, to wnioskowanie mo\u017ce zwr\u00f3ci\u0107 inny zestaw wynik\u00f3w. Podobnie stanie si\u0119 po zaktualizowaniu fakt\u00f3w w repozytorium (np. po nocnym zasileniu informacjami o nowych produktach zakupionych przez klient\u00f3w w ostatniej dobie).<\/li>\n\n\n\n<li>Reagowanie na zdarzenia \u2013 czyli tryb, w kt\u00f3rym w repozytorium przechowywanych jest szereg regu\u0142 biznesowych (zazwyczaj do\u015b\u0107 stabilnych), a silnik regu\u0142owy zasilany jest na bie\u017c\u0105co sp\u0142ywaj\u0105cymi nowymi faktami. Ten tryb znajduje zastosowanie np. w systemach czasu rzeczywistego, kiedy trzeba na bie\u017c\u0105co reagowa\u0107 na dynamicznie uaktywniaj\u0105ce si\u0119 regu\u0142y biznesowe, ewentualnie jako komponent, kt\u00f3ry mo\u017cna \u201eodpyta\u0107\u201d o wynik uruchomienia regu\u0142 dla okre\u015blonego zestawu przekazanych fakt\u00f3w.<\/li>\n\n\n\n<li><u>Przyk\u0142ad: <\/u>Firma telekomunikacyjna posiada bardzo skomplikowane regu\u0142y przyznawania klientom przed\u0142u\u017caj\u0105cym umowy rabat\u00f3w, w zale\u017cno\u015bci od wielu kryteri\u00f3w (takich jak liczba i typy posiadanych produkt\u00f3w, d\u0142ugo\u015b\u0107 umowy, terminowo\u015b\u0107 sp\u0142aty zad\u0142u\u017cenia, zgody marketingowe itp.) Regu\u0142y te s\u0105 relatywnie cz\u0119sto modyfikowane i dlatego zosta\u0142y wprowadzone do repozytorium jako zestaw regu\u0142 biznesowych (wzajemnie si\u0119 wykluczaj\u0105cych). Regu\u0142y te operuj\u0105 na faktach, kt\u00f3re nie s\u0105 przechowywane w repozytorium, natomiast s\u0105 do niego wstawiane ad hoc. System wsparcia sprzeda\u017cy za ka\u017cdym, kiedy musi przedstawi\u0107 wyliczony rabat dla okre\u015blonego klienta, \u0142\u0105czy si\u0119 z repozytorium, wstawia do niego fakty dotycz\u0105ce tego klienta i uruchamia mechanizm wnioskowania. Je\u017celi kt\u00f3ra\u015b z regu\u0142 si\u0119 aktywuje i wstawie do repozytorium fakt okre\u015blaj\u0105cy wysoko\u015b\u0107 rabatu, to znaczy \u017ce klient kwalifikuje si\u0119 do tego rabatu i ta informacja zostanie przekazana zwrotnie do systemu sprzeda\u017cy.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Elementy silnika regu\u0142owego<\/h2>\n\n\n\n<p>Alex Berson i Larry Dubov \u2013 dwaj wybitni eksperci z dziedziny zarz\u0105dzania danymi \u2013 w swojej publikacji \u201eMastering Data Management and Customer Integration for a Global Enterprise\u201d definiuj\u0105 podstawowe komponenty, kt\u00f3re powinien integrowa\u0107 silnik regu\u0142owy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Repozytorium danych, s\u0142u\u017c\u0105ce do przechowywania regu\u0142 biznesowych definiowanych przez u\u017cytkownik\u00f3w,<\/li>\n\n\n\n<li>Edytor regu\u0142, czyli narz\u0119dzie dostarczaj\u0105ce elastyczny i wygodny interfejs definiowania i zarz\u0105dzania tymi regu\u0142ami,<\/li>\n\n\n\n<li>Narz\u0119dzie raportowe, umo\u017cliwiaj\u0105ce weryfikacj\u0119 istniej\u0105cych regu\u0142 i tworzenie raport\u00f3w na ich podstawie,<\/li>\n\n\n\n<li>W\u0142a\u015bciwy silnik uruchomieniowy, implementuj\u0105cy algorytmy potrafi\u0105ce wnioskowa\u0107 i reagowa\u0107 na zdarzenia.<\/li>\n<\/ul>\n\n\n\n<p>Przyk\u0142adem narz\u0119dzia, kt\u00f3re dostarcza wszystkie wspomniane komponenty jest np. JBoss Drools.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cechy silnika regu\u0142owego<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Programowanie deklaratywne<\/h3>\n\n\n\n<p>U\u017cycie silnika regu\u0142owego pozwala zmieni\u0107 spos\u00f3b my\u015blenia o podej\u015bciu do rozwi\u0105zania okre\u015blonego problemu, wprowadzaj\u0105c prosty, deklaratywny model opisu logiki biznesowej. W odr\u00f3\u017cnieniu od klasycznego podej\u015bcia algorytmicznego stosowanego podczas programowania imperatywnego, podej\u015bcie deklaratywne umo\u017cliwia sprowadzenie rozwi\u0105zanie do zbioru regu\u0142 okre\u015blaj\u0105cych \u201eco nale\u017cy zrobi\u0107\u201d, a niekoniecznie \u201eco nale\u017cy zrobi\u0107 i w jaki spos\u00f3b to zrobi\u0107\u201d. Przyk\u0142adowo \u2013u\u017cytkownika biznesowego w firmie ubezpieczeniowej mo\u017ce interesowa\u0107 informacja ilu klient\u00f3w powy\u017cej 40 roku \u017cycia zakwalifikuje si\u0119 do zni\u017cki, je\u017celi odpowiednio zmieni\u0105 si\u0119 kryteria sta\u017cu i liczby lat bezwypadkowej jazdy. Nie musi w tym celu wiedzie\u0107, jak po\u0142\u0105czy\u0107 dane przychodz\u0105ce z r\u00f3\u017cnych system\u00f3w albo w jaki spos\u00f3b iteruje si\u0119 po li\u015bcie obiekt\u00f3w. Dzi\u0119ki temu nierzadko bardzo skomplikowane obliczenia s\u0105 dla takiego u\u017cytkownika ukryte za relatywnie prostymi regu\u0142ami.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Separacja danych i logiki biznesowej<\/h3>\n\n\n\n<p>Pomimo coraz wi\u0119kszej \u015bwiadomo\u015bci problem\u00f3w wynikaj\u0105cych z ca\u0142kowitej separacji zespo\u0142\u00f3w biznesowych i programistycznych, nadal w wielu organizacjach ci\u0119\u017cko jest zapewni\u0107 odpowiedni poziom zrozumienia zagadnie\u0144 biznesowych ze strony programist\u00f3w oraz technicznych ze strony ekspert\u00f3w dziedzinowych, definiuj\u0105cych wymagania. Zastosowanie silnika regu\u0142owego pozwala oddzieli\u0107 od siebie dane i logik\u0119 biznesow\u0105 opieraj\u0105c\u0105 si\u0119 na tych danych. Dane przechowywane s\u0105 w obiektach domenowych, natomiast logika zawiera si\u0119 w zestawie zdefiniowanych regu\u0142 bazuj\u0105cych na tych obiektach. O ile z programistycznego punktu widzenia jest to niezgodne z jednym z fundament\u00f3w programowania obiektowego, zw\u0142aszcza je\u017celi przetwarzane dane pochodz\u0105 z r\u00f3\u017cnych domen, o tyle dla nietechnicznych ekspert\u00f3w dziedzinowych ten aspekt mo\u017ce by\u0107 kluczowy dla zrozumienia mechanizm\u00f3w definiowania biznesowej logiki w systemie i jej utrzymywania w przysz\u0142o\u015bci. Tacy u\u017cytkownicy nie musz\u0105 mie\u0107 \u015bwiadomo\u015bci stopnia skomplikowania algorytm\u00f3w ani zawi\u0142o\u015bci modelu przechowywanych danych, wystarczy, \u017ce b\u0119d\u0105 w stanie sprowadzi\u0107 swoj\u0105 wiedz\u0119 o domenowych obiektach oraz wymagania do poziomu regu\u0142 lub wzorc\u00f3w umo\u017cliwiaj\u0105cych np. wyszukiwanie w nich okre\u015blonych przypadk\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Centralizacja wiedzy<\/h3>\n\n\n\n<p>Dobrze zdefiniowane i opisane regu\u0142y mog\u0105 stanowi\u0107 w organizacji centralne repozytorium wiedzy na temat biznesowej logiki. Umiej\u0119tne przygotowanie regu\u0142 i ich dekompozycja (zasada jedno wymaganie \u2013 jedna regu\u0142a), konsekwentne podej\u015bcie do ich utrzymywania oraz rzetelne opisywanie mog\u0105 wr\u0119cz zast\u0105pi\u0107, przynajmniej cz\u0119\u015bciowo, dokumentacj\u0119 systemu, co przy rosn\u0105cej popularno\u015bci podej\u015bcia agile do realizacji projekt\u00f3w mo\u017ce by\u0107 bardzo du\u017c\u0105 zalet\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Korzy\u015bci z u\u017cycia silnika regu\u0142owego<\/h2>\n\n\n\n<p>Wykorzystanie silnika regu\u0142owego do rozwi\u0105zania pewnej klasy problem\u00f3w biznesowych ma szereg zalet, o kt\u00f3rych warto w tym miejscu wspomnie\u0107.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Czytelno\u015b\u0107 logiki biznesowej Wymagania opisane za pomoc\u0105 regu\u0142 s\u0105 znacznie \u0142atwiejsze do zrozumienia i weryfikacji przez ekspert\u00f3w dziedzinowych i innych u\u017cytkownik\u00f3w biznesowych ni\u017c fragmenty kodu programistycznego. Tym bardziej, \u017ce bez wsparcia narz\u0119dzi takich jak silniki regu\u0142owe, programi\u015bci pr\u00f3buj\u0105c wiernie zaimplementowa\u0107 skomplikowan\u0105 logik\u0119 a nast\u0119pnie utrzyma\u0107 jej aktualno\u015b\u0107 pod wp\u0142ywem zmieniaj\u0105cych si\u0119 wymaga\u0144 biznesowych, cz\u0119sto padaj\u0105 ofiarami efektu tzw. kodu spaghetti.<\/li>\n\n\n\n<li>Elastyczno\u015b\u0107 rozwi\u0105zania Tworzenie nowych regu\u0142, usuwanie nieaktualnych oraz poprawianie istniej\u0105cych pod wp\u0142ywem zmieniaj\u0105cych si\u0119 wymaga\u0144 biznesowych jest znacznie prostsze i szybsze ni\u017c manipulowanie w kodzie programistycznym i wdra\u017canie zmian w systemach IT.<\/li>\n\n\n\n<li>Sp\u00f3jno\u015b\u0107 rozwi\u0105zania Translacja wymaga\u0144 biznesowych na regu\u0142y opisane prostym j\u0119zykiem zwi\u0119ksza sp\u00f3jno\u015b\u0107 rozwi\u0105zania i umo\u017cliwia ponowne wykorzystanie wykonanej wcze\u015bniej pracy.<\/li>\n\n\n\n<li>Efektywno\u015b\u0107 i wydajno\u015b\u0107 Silnik regu\u0142owy w trakcie przetwarzania zdefiniowanych regu\u0142, d\u0105\u017cy do rozwi\u0105zania wykorzystuj\u0105c najbardziej efektywne algorytmy, takie jak Rete i Leaps. Zazwyczaj ma on tak\u017ce wbudowane sprawdzone mechanizmy optymalizacyjne, dzi\u0119ki kt\u00f3rym \u2013 przynajmniej w teorii \u2013 wydajno\u015b\u0107 pracy nie zale\u017cy od liczby zdefiniowanych regu\u0142.<\/li>\n\n\n\n<li>Oszcz\u0119dno\u015b\u0107 czasu programist\u00f3w<\/li>\n\n\n\n<li>Nawet w sytuacji, kiedy przygotowanie regu\u0142 spadnie na barki programisty (np. w przypadku bardzo skomplikowanej logiki), b\u0119dzie on m\u00f3g\u0142 skupi\u0107 si\u0119 na rozwi\u0105zywaniu faktycznych problem\u00f3w a nie implementowaniu tasiemcowego kodu pe\u0142nego p\u0119tli i instrukcji warunkowych.<\/li>\n\n\n\n<li>Oszcz\u0119dno\u015b\u0107 czasu u\u017cytkownik\u00f3w biznesowych Wiedza zorganizowana w postaci regu\u0142 skraca tak\u017ce czas potrzebny na wdra\u017canie nowych os\u00f3b w dan\u0105 dziedzin\u0119.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Kiedy warto u\u017cy\u0107 silnika regu\u0142owego?<\/h2>\n\n\n\n<p>Lektura poprzednich rozdzia\u0142\u00f3w mo\u017ce wprowadzi\u0107 w mylne przekonanie, \u017ce silnik regu\u0142owy jako taki warto wdro\u017cy\u0107 zawsze, niezale\u017cnie od domeny, skali i klasy problemu wymagaj\u0105cego rozwi\u0105zania. Pomimo niekwestionowanych zalet, kt\u00f3re w pewnym sensie same okre\u015blaj\u0105 kiedy tego rodzaju narz\u0119dzia warto jest w organizacji wdro\u017cy\u0107, nie jest to do ko\u0144ca prawda. Dlatego pytanie o silnik regu\u0142owy lepiej jest odwr\u00f3ci\u0107 i zastanowi\u0107 si\u0119, czy s\u0105 takie przypadki, kiedy jego wykorzystanie nie b\u0119dzie w pe\u0142ni uzasadnione.<\/p>\n\n\n\n<p>Na pewno niski stopie\u0144 skomplikowania regu\u0142 biznesowych, np. bazuj\u0105cych na pojedynczych obiektach domenowych i sprowadzaj\u0105cych si\u0119 do prostego schematy <em>if-then<\/em> oraz ich niewielka liczba wynikaj\u0105ca z niedu\u017cej liczby wymaga\u0144 mog\u0105 sk\u0142oni\u0107 do zastanowienia, czy warto wytacza\u0107 tak pot\u0119\u017cne dzia\u0142o, jak silnik regu\u0142owy. W niekt\u00f3rych przypadkach prosta aplikacja realizuj\u0105ca logik\u0119 biznesow\u0105 b\u0119dzie rozwi\u0105zaniem w zupe\u0142no\u015bci wystarczaj\u0105cym i dostatecznie \u0142atwym w utrzymaniu, \u017ceby nie zaprz\u0105ta\u0107 sobie g\u0142owy dodatkowymi elementami architektury IT. Zw\u0142aszcza, je\u017celi narz\u0119dzie wspieraj\u0105ce biznes s\u0105 ju\u017c zaimplementowane i nie ma konieczno\u015bci ich wymiany na inne. Podobne w\u0105tpliwo\u015bci mo\u017cna mie\u0107 w przypadku organizacji, w kt\u00f3rych utrzymywane regu\u0142y biznesowe s\u0105 stabilne i rzadko podlegaj\u0105 zmianom, ewentualnie realizowany projekt ma charakter jednorazowy i nie b\u0119dzie modyfikowany ani utrzymywany w przysz\u0142o\u015bci \u2013 w takim przypadku wysi\u0142ek w\u0142o\u017cony w implementacj\u0119 i konfiguracj\u0119 narz\u0119dzia mo\u017ce nie zosta\u0107 przez to narz\u0119dzie zrekompensowany na etapie u\u017cytkowania. Kryteria nie s\u0105 tutaj jasno zdefiniowane, dlatego ka\u017cdy przypadek nale\u017cy rozwa\u017cy\u0107 indywidualnie, warto jednak mie\u0107 \u015bwiadomo\u015b\u0107 na co zwr\u00f3ci\u0107 uwag\u0119 podejmuj\u0105c decyzj\u0119 o wdro\u017ceniu lub nie narz\u0119dzi opartych na silnikach regu\u0142owych.<\/p>\n\n\n\n<p>Je\u017celi w danej organizacji kluczowym kryterium jest wydajno\u015b\u0107 pracy narz\u0119dzia realizuj\u0105cego biznesow\u0105 logik\u0119, mo\u017ce si\u0119 okaza\u0107, \u017ce dedykowane rozwi\u0105zanie innej klasy b\u0119dzie lepiej dostosowane do wymaga\u0144 pozafunkcjonalnych. Nale\u017cy pami\u0119ta\u0107, \u017ce \u017caden algorytm nie sprawdzi si\u0119 r\u00f3wnie dobrze dla wszystkich klas problem\u00f3w. W uj\u0119ciu statystycznym algorytmy Rete i Leaps wypadaj\u0105 bardzo dobrze, ale mo\u017ce si\u0119 okaza\u0107, \u017ce w specyficznych przypadkach bardziej wydajne b\u0119dzie zaimplementowanie rozwi\u0105zania opartego na innych algorytmach.<\/p>\n\n\n\n<p>&nbsp;<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;2377&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;3&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 3)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;JBoss Drools: wprowadzenie do silnik\u00f3w regu\u0142owych - cz.1&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 3)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Niemal ka\u017cda wi\u0119ksza organizacja przechowuj\u0105ca i przetwarzaj\u0105ca dane na potrzeby w\u0142asnej dzia\u0142alno\u015bci, bez wzgl\u0119du na domen\u0119 tych danych, pr\u0119dzej czy &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/jboss-drools-wprowadzenie-do-silnikow-regulowych-cz-1\/\">Continued<\/a><\/p>\n","protected":false},"author":92,"featured_media":498,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[],"class_list":["post-2377","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/10\/Fotolia_88830082_L.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2377"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/92"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=2377"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2377\/revisions"}],"predecessor-version":[{"id":23502,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2377\/revisions\/23502"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/498"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=2377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=2377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=2377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}