Rules Engine-plusy i minusy

Przeprowadzam audyt projektu, który wykorzystuje tak zwany Silnik Rules Engine . Krótko mówiąc, jest to sposób na eksternalizację logiki biznesowej z kodu aplikacji.

Ta koncepcja jest dla mnie zupełnie nowa i jestem do niej dość sceptyczny. Po wysłuchaniu ludzi mówiących o anemicznych modelach domen przez ostatnie kilka lat, kwestionuję podejście rules Engine. Dla mnie wydają się świetnym sposobem na osłabienie modelu domeny. Na przykład powiedzmy, że robię Java webapp interakcję z regułami Silnik. Następnie decyduję, że chcę mieć aplikację na Androida opartą na tej samej domenie. Jeśli nie chcę, aby aplikacja na Androida działała również z silnikiem reguł, będę musiał przegapić cokolwiek logika biznesowa została już napisana.

Ponieważ nie mam z nimi jeszcze żadnego doświadczenia, tylko ciekawość, ciekaw jestem jakie są plusy i minusy używania silnika reguł? Jedynym profesjonalistą, o którym myślę, jest to, że nie musisz przebudowywać całej aplikacji, aby zmienić niektóre zasada biznesowa (ale naprawdę, ile aplikacji ma tak wiele zmian?). Ale użycie silnika zasad do rozwiązania tego problemu brzmi jak przyklejenie plastra na ranę ze strzelby.

UPDATE-od czasu napisania tego, sam Bóg, Martin Fowler, napisał na blogu o używaniu silnika reguł.

Author: bpapa, 2008-10-30

12 answers

Większość silników rule, które widziałem, jest postrzegana jako czarna skrzynka przez kod systemu. Gdybym miał zbudować model domeny, prawdopodobnie chciałbym, aby pewne reguły biznesowe były nieodłączne dla modelu domeny, np. reguły biznesowe, które mówią mi, kiedy obiekt ma nieprawidłowe wartości. Pozwala to wielu systemom na współdzielenie modelu domeny bez powielania logiki biznesowej. Każdy system może używać tej samej usługi reguł do walidacji mojego modelu domeny, ale wydaje się to osłabiać mój model domeny (jak wskazano w pytaniu). Dlaczego? Ponieważ zamiast konsekwentnie egzekwować moje reguły biznesowe we wszystkich systemach przez cały czas, polegam na programistach systemowych, aby określić, kiedy reguły biznesowe powinny być egzekwowane (przez wywołanie usługi reguł). Może to nie być problem, jeśli model domeny jest całkowicie wypełniony, ale może być problematyczne, jeśli masz do czynienia z interfejsem użytkownika lub systemem, który zmienia wartości w modelu domeny w czasie jego życia.

Jest jeszcze jedna klasa zasady biznesowe: podejmowanie decyzji. Na przykład firma ubezpieczeniowa może wymagać sklasyfikowania ryzyka ubezpieczeniowego wnioskodawcy i uzyskania składki. Możesz umieścić tego typu reguły biznesowe w swoim modelu domeny, ale scentralizowana decyzja w przypadku takich scenariuszy jest zwykle pożądana i w rzeczywistości całkiem dobrze pasuje do architektury zorientowanej na usługi. To rodzi pytanie, dlaczego silnik reguł, a nie kod systemu. Miejsce, w którym silnik reguł może być lepszym wyborem jest miejsce, w którym zasady biznesowe odpowiedzialne za decyzję zmieniają się w czasie (jak wskazywały niektóre inne odpowiedzi).

Silniki reguł zazwyczaj pozwalają na zmianę reguł bez ponownego uruchamiania systemu lub wdrażania nowego kodu wykonywalnego (niezależnie od obietnic, które otrzymujesz od dostawcy, upewnij się, że przetestujesz zmiany w środowisku nieprodukcyjnym, ponieważ nawet jeśli silnik reguł jest bezbłędny, ludzie nadal zmieniają reguły). Jeśli myślisz: "mogę to zrobić, używając bazy danych do przechowywania wartości, które się zmieniają", masz rację. Silnik reguł nie jest magicznym pudełkiem, które robi coś nowego . Ma to być narzędzie, które zapewnia wyższy poziom abstrakcji, dzięki czemu można skupić się mniej na wymyślaniu koła na nowo. Wielu dostawców idzie o krok dalej, umożliwiając tworzenie szablonów, dzięki czemu użytkownicy biznesowi mogą wypełniać puste pola zamiast uczyć się języka reguł.

Jedna uwaga na temat szablonów: szablony nigdy nie mogą zająć mniej czasu niż pisanie reguły bez szablonu ponieważ szablon musi, co najmniej, opisywać regułę. Zaplanuj wyższy koszt początkowy ( taki sam jak w przypadku zbudowania systemu, który używał bazy danych do przechowywania wartości, które się zmieniają, a zapisywanie reguł bezpośrednio w kodzie systemu) - zwrot z inwestycji wynika z oszczędności na przyszłej konserwacji kodu systemowego.

 36
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 15:20:09

Myślę, że twoje obawy dotyczące anemicznych modeli domen są słuszne.

Widziałem dwie aplikacje znanego komercyjnego silnika Rete rules działającego w produkcji, gdzie pracuję. Uznałbym jeden za sukces, a drugi za porażkę.

Pomyślna aplikacja to aplikacja drzewa decyzyjnego, składająca się z ~10 drzew po ~ 30 punktów gałęzi każdy. Silnik reguł ma interfejs użytkownika, który pozwala ludziom biznesowym zachować zasady.

Mniej udana aplikacja ma ~3000 zasad / align = "left" / Nikt nie ma pojęcia, czy istnieją sprzeczne zasady po dodaniu nowego. Niewiele jest zrozumienia algorytmu Rete, a wiedza o produkcie opuściła firmę, więc stała się czarną skrzynką, która jest nietykalna i niewykonalna. Na cykl wdrażania nadal wpływają zmiany reguł - w przypadku zmiany reguł należy wykonać kompletny test regresji. Pamięć też była problemem.

Stąpałbym lekko. Gdy zbiór reguł jest skromny łatwo zrozumieć zmiany, takie jak uproszczona próbka e-maila podana powyżej. Kiedy liczba zasad wzrośnie do setek, myślę, że możesz mieć problem.

Martwiłbym się również, że silnik reguł stanie się wąskim gardłem Singletona w Twojej aplikacji.

Nie widzę nic złego w używaniu obiektów jako sposobu na partycję, która rządzi przestrzenią silnika. Osadzanie zachowań w obiektach, które podlegają prywatnemu silnikowi reguł wydaje mi się w porządku. Problemy pojawią się, gdy silnik zasad wymaga stanu, który nie jest częścią jego obiektu, aby poprawnie strzelać. Ale to kolejny przykład trudnego projektowania.

 24
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-29 19:20:29

Silniki reguł mogą oferować wiele wartości, w niektórych przypadkach.

Po pierwsze, wiele silników reguł działa w bardziej deklaratywny sposób. Bardzo prostym przykładem może być AWK, gdzie można przypisać wyrażenia regularne do bloków kodu. Gdy regex jest widziany przez skaner plików, blok kodu jest wykonywany.

Widać, że w tym przypadku, jeśli masz, powiedzmy, duży plik AWK i chcesz dodać kolejną "regułę", możesz łatwo przejść do dołu pliku, dodać regex i logikę i gotowe z nim. W szczególności, w przypadku wielu aplikacji, nie jesteś szczególnie zaniepokojony tym, co robią inne zasady, a zasady tak naprawdę nie współgrają ze sobą.

W ten sposób plik AWK staje się bardziej "zupą reguł". Ta natura "zupy reguł" pozwala ludziom skupić się bardzo mocno na swojej domenie z niewielką troską o wszystkie inne zasady, które mogą być w systemie.

Na przykład Frank jest zainteresowany zamówieniami o łącznej wartości ponad 1000 usd, więc wprowadza zasadę system, który go interesuje. "Jeśli zamówienie.razem > 1000 następnie napisz do Franka".

Tymczasem Sally chce wszystkich rozkazów z zachodniego wybrzeża: "jeśli rozkaz.source = = "WEST_COAST" then email Sally".

Tak więc w tym trywialnym, wymyślonym przypadku widać, że porządek może spełniać obie reguły, jednak obie reguły są od siebie niezależne. Zamówienie na 1200 dolarów z Zachodniego Wybrzeża zawiadamia Franka i Sally. Kiedy Frank nie będzie się już martwił, po prostu wyciągnie jego wykluczenie z zupy.

Dla wielu sytuacje, ta elastyczność może być bardzo potężna. Może również, jak w tym przypadku, być narażony na użytkowników końcowych dla prostych zasad. Korzystanie z wyrażeń wysokiego poziomu i być może lekkiego skryptowania.

Teraz, oczywiście, w skomplikowanym systemie istnieją różnego rodzaju powiązania, które mogą się zdarzyć, i dlatego cały system nie jest "zrobiony z regułami". Ktoś, gdzieś będzie rządził zasadami, które nie wymkną się spod kontroli. Ale to niekoniecznie zmniejsza wartość, jaką taki system może zapewnij.

Pamiętaj, że nie dotyczy to nawet systemów eksperckich, gdzie reguły strzelają do danych, które reguły mogą tworzyć, ale prostszy system reguł.

W każdym razie, mam nadzieję, że ten przykład pokazuje, jak system reguł może pomóc w powiększeniu większej aplikacji.

 23
Author: Will Hartung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 15:03:41

Największym profesjonalistą, jaki widziałem dla silników reguł jest to, że pozwala właścicielom reguł biznesowych wdrażać reguły biznesowe, zamiast nakładać na programistów obciążenie. Nawet jeśli masz zwinny proces, w którym stale otrzymujesz informacje zwrotne od interesariuszy i przechodzisz przez szybkie iteracje, nadal nie osiągniesz poziomu wydajności, który można osiągnąć dzięki wdrożeniu ich przez osoby tworzące reguły biznesowe.

Poza tym nie można podkreslić wartość w usuwaniu cyklu recompile-retest-reeploy, który może wynikać z prostej zmiany reguły, jeśli reguły są osadzone w kodzie. Często jest kilka zespołów, które są zaangażowane w umieszczenie błogosławieństwa na kompilacji, a korzystanie z silnika reguł może sprawić, że wiele z tego nie będzie potrzebne.

 18
Author: Chris Marasti-Georg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 14:57:25

Napisałem silnik reguł dla klienta. Największe zwycięstwo odniosły wszystkie zainteresowane strony. Silnik mógł uruchomić (lub odtworzyć) zapytanie i wyjaśnić, co się dzieje w tekście. Ludzie biznesu mogli przyjrzeć się opisowi tekstu i szybko wskazać niuanse w przepisach, wyjątkach i innych szczególnych przypadkach. Po zaangażowaniu strony biznesowej Walidacja stała się znacznie lepsza, ponieważ łatwo było uzyskać ich wkład. Dodatkowo silnik rules może żyć oddzielnie od innych części baza kodu aplikacji, dzięki czemu można go używać w różnych aplikacjach.

Przekręt polega na tym, że niektórzy programiści nie lubią się zbyt wiele uczyć. Silniki reguł i zasady, które w nich wprowadzasz, wraz z rzeczami, które je implementują, mogą być trochę Owłosione. Chociaż dobry system może z łatwością obsłużyć chore i pokręcone sieci logiczne( lub często nielogiczne;), nie jest to tak proste, jak kodowanie kilku if stwierdzeń(bez względu na to, co robią niektóre z prostych silników reguł). Silnik reguł daje narzędzia do zajmuj się relacjami z regułami, ale nadal musisz być w stanie wyobrazić sobie to wszystko w swoim umyśle. Czasami jest to jak życie w filmie Brazylia . :)
 12
Author: brian d foy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-13 12:11:43

To (jak Wszystko inne) zależy od twojej aplikacji. W przypadku niektórych aplikacji (Zwykle tych, które nigdy się nie zmieniają lub reguły są najlepsze na rzeczywistych stałych, tzn. nie zmienią się zauważalnie w eonach, na przykład właściwości fizyczne i formuły) nie ma sensu używać silnika reguł, po prostu wprowadza dodatkową złożoność i wymaga od programisty większego zestawu umiejętności.

Dla innych aplikacji to naprawdę dobry pomysł. Weźmy na przykład przetwarzanie zamówień (zamówienia są wszystko, od fakturowania po transakcje walutowe), co jakiś czas następuje drobna zmiana odpowiedniego prawa lub kodeksu (w sensie sądowym), które wymaga spełnienia nowego wymogu (na przykład podatku od sprzedaży, klasyka). Zamiast próbować wymusić starą aplikację w tej nowej sytuacji, w której nagle musisz myśleć o podatku od sprzedaży, gdzie jak wcześniej nie, łatwiej jest dostosować swój zestaw reguł, zamiast mieszać się w potencjalnie duży zestaw Twój kod.

W takim razie kolejna nowelizacja twojego Samorządu wymaga raportowania wszystkich sprzedaży w określonych kryteriach, a nie musisz wchodzić i to też dodawać. W końcu otrzymasz bardzo złożony kod, który okaże się dość trudny do zarządzania, gdy zawrócisz i chcesz przywrócić efekt jednej z reguł, bez wpływu na wszystkie pozostałe...

 8
Author: andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 15:05:49

Wszyscy do tej pory byli bardzo pozytywnie nastawieni do zasad, ale radzę czytelnikowi zachować ostrożność. Gdy problem staje się nieco bardziej skomplikowany, może się okazać, że cały silnik reguł stał się nieodpowiedni lub znacznie bardziej skomplikowany niż w bardziej wydajnym języku. Ponadto w przypadku wielu problemów silniki reguł nie będą w stanie łatwo wykryć właściwości, które znacznie zmniejszają czas wykonywania i pamięć oceny warunku. Jest stosunkowo niewiele sytuacje, w których wolałbym silnik reguł niż Framework iniekcji zależności lub bardziej dynamiczny język programowania.

 5
Author: John with waffle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 15:13:44

" ale naprawdę, ile aplikacji ma tak wiele zmian?"

Szczerze mówiąc, każda aplikacja, nad którą pracowałem przeszedł poważne przepływ pracy i / lub zmiany logiczne od koncepcji do dobrze po wdrożeniu. To najważniejszy powód programowania" konserwacji"...

Rzeczywistość jest taka, że nie można myśleć o wszystkim z góry, stąd powód zwinnych procesów. Co więcej, BA zawsze zdaje się tęsknić za czymś ważnym, dopóki nie zostanie znaleziony w testach.

Rule Engines force you aby naprawdę oddzielić logikę biznesową od prezentacji i przechowywania. Ponadto, jeśli używasz odpowiedniego silnika, Twoje BA mogą dodawać i usuwać logikę w razie potrzeby. Jak powiedział Chris Marasti-Georg, stawia to na BA. Ale co więcej, pozwala BA uzyskać dokładnie to, o co proszą.

 3
Author: NotMe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 15:20:12

Silnik reguł jest wygraną w konfigurowalnej aplikacji, w której nie chcesz robić niestandardowych kompilacji, jeśli można tego uniknąć. Są również dobre w centralizacji dużych baz reguł i algorytmy, takie jak Rete {[2] } są skuteczne w szybkim dopasowywaniu do dużych zbiorów reguł.

 2
Author: ConcernedOfTunbridgeWells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-31 18:19:11

Wiele dobrych odpowiedzi już ale chciałem dodać kilka rzeczy:

  1. w automatyzacji decyzji o dowolnej złożoności krytyczna rzecz szybko staje się zdolność do zarządzania, a nie wykonywania logiki. Silnik reguł nie pomoże w tym - musisz pomyśleć o możliwościach zarządzania regułami, jakie ma system zarządzania regułami biznesowymi. Większość komercyjnych i open source ' owych silników reguł ewoluowała w systemy zarządzania regułami z repozytoriami, raportujące na użycie reguł, wersjonowanie itp. Repozytorium reguł, uporządkowane w spójne zestawy reguł, które można zaaranżować w celu podejmowania decyzji biznesowych, jest o wiele łatwiejsze do zarządzania niż tysiące linii kodu lub zupa reguł.
  2. Istnieje wiele sposobów na użycie deklaratywnego, opartego na regułach podejścia. Używanie reguł do zarządzania interfejsem użytkownika lub jako część definiowania procesu może być bardzo skuteczne. Najcenniejszym zastosowaniem podejścia opartego na regułach jest jednak automatyzacja decyzji biznesowych i dostarczanie ich w sposób luźny Połączone Usługi decyzyjne, które pobierają dane wejściowe, wykonują reguły i zwracają odpowiedź-decyzję. Rzecz z nich jako usługi, które odpowiadają na pytania dotyczące innych usług, takich jak " Czy ten klient jest dobrym ryzykiem kredytowym "lub" jaki rabat powinienem dać temu klientowi za to zamówienie lub " jaka jest najlepsza sprzedaż Krzyżowa dla tego klienta w tym czasie. Te usługi decyzyjne mogą być bardzo skutecznie budowane przy użyciu systemu zarządzania regułami i pozwalają na łatwą integrację analiz w czasie, coś wiele decyzji skorzystaj z.
 2
Author: James Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-15 11:31:50

Widzę, że silniki reguł, procesów i danych (a. k. a. baz danych) są zasadniczo podobne. Ale z jakiegoś powodu nigdy nie mówimy, że blackboxing podsystemu trwałości jest zły.

Po drugie, z mojego POV, model anemiczny nie jest taki, który jest lekki w implementacji zachowań, jest taki, który jest lekki w samych zachowań . Rzeczywista metoda opisująca dostępne zachowanie w obiekcie modelu domeny nie musi być wykonywana przez sam obiekt.

 1
Author: alphadogg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-22 17:32:54

Największą złożonością z mojego doświadczenia w silnikach reguł jest to, że:

  1. od OOP POV to prawdziwy ból do refaktoryzacji i testowania reguł napisanych w języku deklaratywnym podczas refaktoryzacji kodu, który na nie wpływa.
  2. często powinniśmy zawsze myśleć o kolejności wykonywania zasad, które zmieniają się w bałagan, gdy jest ich dużo.
  3. niektóre drobne zmiany mogą spowodować nieprawidłowe zachowanie reguł prowadzących do błędów produkcyjnych. W praktyce nie zawsze jest możliwe przykryj wszystkie przypadki testami z góry.
  4. reguły mutujące obiekty używane w innych również zwiększają złożoność, powodując, że deweloperzy dzielą je na etapy.
 0
Author: Ivan Voroshilin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-10 06:18:55