Frage

Ich prüfe ein Projekt, das so genannt wird Regeln Engine. Kurz gesagt, dies ist eine Möglichkeit, die Geschäftslogik aus dem Anwendungscode zu externalisieren.

Dieses Konzept ist für mich völlig neu und ich bin ziemlich skeptisch. Nachdem sie Leute überreden hörten Anämische Domänenmodelle In den letzten Jahren stelle ich den Rules Engine -Ansatz in Frage. Für mich scheinen sie eine großartige Möglichkeit zu sein, ein Domänenmodell zu schwächen. Zum Beispiel sagen ich ein Java -Webapp, der mit einer Regeln -Engine interagiert. Dann beschließe ich, eine Android -App zu haben, die auf derselben Domäne basiert. Wenn ich nicht möchte, dass die Android -App auch mit der Rules -Engine interagiert, muss ich die bereits geschriebene Geschäftslogik verpassen.

Da ich noch keine Erfahrung mit ihnen habe, nur Neugier, war ich interessiert, von den Vor- und Nachteilen zu hören, die eine Regeln -Engine verwenden? Der einzige Profi, den ich mir vorstellen kann, ist, dass Sie Ihre gesamte Anwendung nicht neu aufbauen müssen, um eine Geschäftsregel zu ändern (aber wirklich, wie viele Apps haben wirklich so viele Änderungen?). Aber mit einer Rules-Engine zu verwenden, um dieses Problem zu lösen, so wie ich ein Pflaster über eine Schrotflintewunde legte.

Update - Seit dem Schreiben hat der Gott selbst, Martin Fowler, hat bloggt über die Verwendung einer Regeln -Engine.

War es hilfreich?

Lösung

Die meisten Regelmotoren, die ich gesehen habe, werden von Systemcode als schwarze Box angesehen. Wenn ich ein Domänenmodell erstellen würde, möchte ich wahrscheinlich, dass bestimmte Geschäftsregeln für das Domänenmodell wand sein, z. B. Geschäftsregeln, die mir mitteilen, wann ein Objekt ungültige Werte hat. Auf diese Weise können mehrere Systeme das Domänenmodell teilen, ohne die Geschäftslogik zu duplizieren. Ich könnte jedes System denselben Regeldienst verwenden lassen, um mein Domänenmodell zu validieren, aber dies scheint mein Domänenmodell zu schwächen (wie in der Frage hervorgeht). Wieso den? Denn anstatt meine Geschäftsregeln zu jeder Zeit konsequent durchzusetzen, stütze ich mich auf Systemprogrammierer, um festzustellen, wann die Geschäftsregeln erzwungen werden sollen (indem sie den Regeldienst aufrufen). Dies ist möglicherweise kein Problem, wenn das Domänenmodell vollständig besiedelt ist, kann jedoch problematisch sein, wenn Sie mit einer Benutzeroberfläche oder einem System zu tun haben, das die Werte im Domänenmodell über seine Lebensdauer ändert.

Es gibt eine andere Klasse von Geschäftsregeln: Entscheidungsfindung. Beispielsweise muss eine Versicherungsgesellschaft möglicherweise das Risiko eines Bewerbers eintreffen und zu einer Prämie gelangen. Sie können diese Arten von Geschäftsregeln in Ihr Domänenmodell einfügen, aber eine zentrale Entscheidung für solche Szenarien ist normalerweise wünschenswert und passt tatsächlich gut in eine serviceorientierte Architektur. Dies wirft die Frage auf, warum eine Regel Engine und nicht der Systemcode. Der Ort, an dem eine Regel -Engine eine bessere Wahl sein kann, ist der Ort, an dem die Geschäftsregeln für die Entscheidungsänderung im Laufe der Zeit verantwortlich sind (wie einige andere Antworten hervorgehoben haben).

Regelmotoren ermöglichen es Ihnen normalerweise, Regeln zu ändern, ohne Ihr System neu zu starten oder neue ausführbare Code bereitzustellen (unabhängig davon, welche Versprechen Sie von einem Anbieter erhalten, stellen Sie sicher, dass Sie Ihre Änderungen in einer Nichtproduktionsumgebung testen, auch wenn die Regel Engine fehlerfrei ist , Menschen verändern immer noch die Regeln). Wenn Sie denken: "Ich kann das tun, indem ich eine Datenbank verwende, um Werte zu speichern, die sich ändern", haben Sie Recht. Eine Regelmotor ist keine magische Box, die etwas Neues tut. Es soll ein Werkzeug sein, das ein höheres Abstraktionsniveau bietet, sodass Sie sich weniger darauf konzentrieren können, das Rad neu zu erfinden. Viele Anbieter gehen einen Schritt weiter, indem Sie Vorlagen erstellen lassen, damit Geschäftsbenutzer die Lücken ausfüllen können, anstatt eine Regelsprache zu lernen.

Eine Abschiedsvorsicht vor Vorlagen: Vorlagen können niemals weniger Zeit in Anspruch nehmen als eine Regel ohne Vorlage zu schreiben, da die Vorlage zum Minimum die Regel beschreiben muss. Planen Sie eine höhere anfängliche Kosten (das gleiche, als würden Sie ein System erstellen, das eine Datenbank verwendet, um Werte zu speichern, die sich ändern, im Vergleich zu den Regeln direkt in Systemcode) - der ROI liegt daran, dass Sie bei der zukünftigen Wartung des Systemcode sparen .

Andere Tipps

Ich denke, Ihre Bedenken hinsichtlich anämischer Domänenmodelle sind gültig.

Ich habe zwei Anwendungen eines bekannten kommerziellen RETE Rules-Engine in Produktion gesehen, in dem ich arbeite. Ich würde einen Erfolg und den anderen als Misserfolg betrachten.

Die erfolgreiche Anwendung ist eine Entscheidungsbaum -App, die aus ~ 10 Bäumen von jeweils ~ 30 Zweigpunkten besteht. Die Rules -Engine verfügt über eine Benutzeroberfläche, mit der Geschäftsleute die Regeln aufrechterhalten werden können.

Die weniger erfolgreiche Anwendung hat ~ 3000 Regeln in eine Regelndatenbank. Niemand hat eine Idee, wenn es widersprüchliche Regeln gibt, wenn ein neuer hinzugefügt wird. Es gibt wenig Verständnis des RETE -Algorithmus, und das Fachwissen mit dem Produkt hat das Unternehmen verlassen. Es ist also zu einer schwarzen Schachtel geworden, die unantastbar und nicht refaktiv ist. Der Bereitstellungszyklus wird weiterhin von Regelnänderungen beeinflusst - ein vollständiger Regressionstest muss durchgeführt werden, wenn Regeln geändert werden. Das Gedächtnis war auch ein Problem.

Ich würde leicht treten. Wenn ein Regelsatz bescheiden ist, ist es leicht zu verstehen Änderungen, wie die oben angegebene simplen E-Mail-Probe. Sobald die Anzahl der Regeln in die Hunderte klettert, denke ich, dass Sie ein Problem haben könnten.

Ich würde mir auch Sorgen machen, dass ein Rules -Engine in Ihrer Bewerbung ein Singleton -Engpass wird.

Ich sehe nichts Falsches daran, Objekte zu verwenden, um zu partitionieren, die den Motorraum regiert. Das Einbetten des Verhaltens in Objekte, die sich in eine private Regeln verschieben, scheint mir in Ordnung zu sein. Probleme werden Sie treffen, wenn der Rules -Engine einen Zustand erfordert, der nicht Teil seines Objekts ist, um ordnungsgemäß zu schießen. Aber das ist nur ein weiteres Beispiel dafür, dass Design schwierig ist.

Regelmotoren können in bestimmten Fällen viel Wert bieten.

Erstens arbeiten viele Regelmotoren auf deklarativere Weise. Ein sehr grobes Beispiel wäre awk, wo Sie Regexes den Codeblöcken zuweisen können. Wenn der Regex vom Dateiscanner gesehen wird, wird der Codeblock ausgeführt.

Sie können sehen, dass Sie in diesem Fall, wenn Sie beispielsweise eine große awk -Datei hatten und noch eine weitere "Regel" hinzufügen wollten es. Insbesondere für viele Anwendungen sind Sie nicht besonders besorgt darüber, was die anderen Regeln tun, und die Regeln interoperieren nicht wirklich miteinander.

Somit wird die awk -Datei eher wie eine "Regelsuppe". Mit dieser Natur "Regelsuppe" können sich die Leute sehr eng auf ihre Domäne konzentrieren, die sich nur um alle anderen Regeln befassen, die sich im System befinden können.

Zum Beispiel interessiert sich Frank an Bestellungen mit insgesamt mehr als 1000 US -Dollar, also stellt er das Interesse an das Regelsystem ein. "Wenn order.total> 1000 dann eine E -Mail Frank".

In der Zwischenzeit möchte Sally alle Bestellungen von der Westküste: "Wenn order.source == 'west_coast', dann E -Mail Sally".

Sie können also in diesem trivialen, erfundenen Fall sehen, dass eine Ordnung beide Regeln erfüllen kann, aber beide Regeln sind unabhängig voneinander. Eine Bestellung von 1200 US -Dollar an der Westküste benachrichtigt sowohl Frank als auch Sally. Wenn Frank nicht mehr besorgt ist, wird er einfach aus der Suppe ausgehen.

In vielen Situationen kann diese Flexibilität sehr leistungsfähig sein. Es kann auch wie dieser Fall Endbenutzern für einfache Regeln ausgesetzt sein. Verwenden von Ausdrücken von hohem Niveau und möglicherweise leichtes Skript.

In einem komplizierten System gibt es offensichtlich alle Arten von Wechselbeziehungen, die passieren können. Dies ist der Grund, warum das gesamte System nicht "mit Regeln" durchgeführt wird. Jemand, irgendwo wird die Regeln verantwortlich sein, die nicht außer Kontrolle geraten. Dies verringert jedoch nicht unbedingt den Wert, den ein solches System bieten kann.

Wenn dies nicht einmal zu Dingen wie Expertensystemen geht, in denen Regeln auf Daten entlassen werden, die Regeln erstellen können, sondern ein einfacheres Regelnsystem.

Wie auch immer, ich hoffe, dieses Beispiel zeigt, wie ein Regelnsystem dazu beitragen kann, eine größere Anwendung zu erweitern.

Der größte Profi, den ich für Rules Engines gesehen habe, ist, dass die Geschäftsregel -Eigentümer die Geschäftsregeln implementieren können, anstatt die Programmierer zu untersuchen. Selbst wenn Sie einen agilen Prozess haben, bei dem Sie ständig Feedback von den Stakeholdern erhalten und schnelle Iterationen durchlaufen, wird es immer noch nicht das Effizienzniveau erreichen, das durch die Menschen, die die Geschäftsregeln erstellen, diese auch implementieren können.

Außerdem können Sie den Wert bei der Entfernung des Recompile-Retest-Redeploy-Zyklus nicht unterbilden, der sich aus einer einfachen Regeländerung ergeben kann, wenn die Regeln in Code eingebettet sind. Es gibt oft mehrere Teams, die daran beteiligt sind, den Segen für einen Build zu setzen, und die Verwendung einer Regeln -Engine kann viel davon unnötig machen.

Ich habe eine Rules -Engine für einen Kunden geschrieben. Der größte Sieg war die Einbeziehung aller Stakeholder. Der Motor könnte eine Abfrage ausführen (oder wiederholen) und erklären, was im Text geschah. Die Geschäftsleute konnten sich die Textbeschreibung ansehen und schnell auf Nuancen in Regeln, Ausnahmen und anderen Sonderfällen hinweisen. Sobald die Geschäftsseite beteiligt war, wurde die Validierung viel besser, da es einfach war, ihre Input zu erhalten. Darüber hinaus kann die Rules -Engine getrennt von anderen Teilen einer Anwendungscode -Basis leben, sodass Sie sie über Anwendungen hinweg verwenden können.

Die Betrügerin ist, dass einige Programmierer nicht zu viel lernen möchten. Regeln Sie Motoren und die Regeln, die Sie in sie in sie gesteckt haben, zusammen mit dem, was sie implementiert, können ein bisschen haarig sein. Obwohl ein gutes System leicht kranke und verdrehte Logiknetze (oder oft unlogisch;) verarbeiten kann, ist es nicht so einfach wie das Codieren einer Gruppe von if Aussagen (unabhängig von einigen der einfachen Regelmotoren). Die Rules Engine bietet Ihnen die Werkzeuge, um Regelbeziehungen zu bewältigen, aber Sie müssen sich das alles in Ihrem Kopf vorstellen können. Manchmal ist es so, als würde man im Film leben Brasilien. :)

Es hängt (wie alles andere) von Ihrer Anwendung ab. Für einige Anwendungen (normalerweise diejenigen, die sich nie ändern oder die Regeln für Konstanten im wirklichen Leben am besten sind, wird sich bei Äonen, beispielsweise physikalische Eigenschaften und Formeln nicht merklich ändern), es ist nicht sinnvoll, eine Regel -Engine zu verwenden, es nur führt zusätzliche Komplexität ein und erfordert, dass der Entwickler eine größere Fähigkeiten ermöglicht.

Für andere Anwendungen ist es wirklich eine gute Idee. Nehmen Sie beispielsweise Bestellverarbeitung (Bestellungen von der Rechnungsstellung bis zur Verarbeitung von Währungsgeschäften). Ab und zu gibt es eine winzige Änderung eines relevanten Gesetzes oder Code (im gerichtlichen Sinne), bei dem Sie eine neue Anforderung (in der Umsatzsteuer in der Umsatzsteuer erfüllen müssen , ein Klassiker). Anstatt zu versuchen, Ihre alte Anwendung in diese neue Situation zu zwingen, in der Sie plötzlich über die Umsatzsteuer nachdenken müssen, wo es sich wie zuvor nicht getan hat, ist es einfacher, Ihren Regelsatz anzupassen, anstatt sich in potenziell eine große Einmischung einmischen zu müssen Set Ihres Codes.

Die nächste Änderung Ihrer lokalen Regierung erfordert dann die Berichterstattung über alle Verkäufe innerhalb eines bestimmten Kriteriums, anstatt dass Sie dies auch hinzufügen müssen. Am Ende haben Sie einen sehr komplexen Code, der sich beim Umdrehen als ziemlich schwierig erweisen wird und die Wirkung eines der Regeln zurückversetzt, ohne alle anderen zu beeinflussen ...

Bisher war bisher sehr positiv über Regelnmotoren, aber ich rate dem Leser, vorsichtig zu sein. Wenn ein Problem ein bisschen komplizierter wird, können Sie plötzlich feststellen, dass eine gesamte Regeln -Engine ungeeignet oder viel komplizierter als in einer leistungsstärkeren Sprache. Für viele Probleme können Regeln -Motoren auch nicht leicht Eigenschaften erkennen, die die Laufzeit und den Speicherpflichtigen bei der Bewertung des Zustands erheblich reduzieren. Es gibt relativ wenige Situationen, in denen ich eine Regel -Engine für einen Abhängigkeitsinjektionsrahmen oder eine dynamischere Programmiersprache bevorzugen würde.

"Aber wie viele Apps haben wirklich so viele Veränderungen?"

Ehrlich gesagt hat jede App, an der ich gearbeitet habe, ernsthafte Workflow- und/oder logische Änderungen des Konzepts bis zur Bereitstellung durchlaufen. Es ist der Hauptgrund für die "Wartung" -Programmierung ...

Die Realität ist, dass man sich im Voraus nicht an alles vorstellen kann, daher der Grund für agile Prozesse. Außerdem scheinen die BA immer etwas Wichtiges zu verpassen, bis es im Test gefunden wird.

Regel Engines zwingen Sie dazu, die Geschäftslogik von Präsentation und Lagerung wirklich zu trennen. Wenn Sie den richtigen Motor verwenden, können Ihre BAs nach Bedarf Logik hinzufügen und entfernen. Wie Chris Marasti-Georg sagte, wird der BA untersucht. Aber mehr als das erlaubt es dem BA, genau das zu bekommen, was sie verlangen.

Eine Rules -Engine ist ein Gewinn für eine konfigurierbare Anwendung, bei der Sie keine benutzerdefinierten Builds durchführen möchten, wenn sie vermieden werden können. Sie sind auch gut darin, große Grundlagen von Regeln und Algorithmen zu zentralisieren, wie Rete sind effizient, um schnell gegen große Regelsätze abzustimmen.

Viele gute Antworten waren bereits, wollten aber ein paar Dinge hinzufügen:

  1. Bei der Automatisierung einer Entscheidung jeglicher Komplexität wird die kritische Sache schnell zu Ihrer Fähigkeit, die beteiligte Logik zu verwalten, anstatt sie auszuführen. Eine Rules -Engine hilft nicht dabei - Sie müssen über die Regelverwaltungsfunktionen nachdenken, die ein Unternehmensregulierungsmanagementsystem hat. Die meisten kommerziellen und Open -Source -Regeln haben sich zu Regelmanagementsystemen mit Repositorys entwickelt, die über die Regelnutzung, die Versionierung usw. berichten, ein Repository von Regeln, die in kohärenten Regelsätze aufgebaut werden, die orchestriert werden können, um Geschäftsentscheidungen zu treffen Tausende von Codezeilen oder eine Regelsuppe.
  2. Es gibt viele Möglichkeiten, einen deklarativen, regelbasierten Ansatz zu verwenden. Die Verwendung von Regeln zur Verwaltung einer Benutzeroberfläche oder als Teil der Definition eines Prozesses kann sehr effektiv sein. Die wertvollste Verwendung eines Regelnansatzes besteht jedoch darin, Geschäftsentscheidungen zu automatisieren und dies als locker gekoppelte Entscheidungsdienste zu liefern, die Input annehmen, Regeln ausführen und eine Antwort zurückgeben - eine Entscheidung. Als Dienstleistungen, die Fragen für andere Dienste beantworten wie "Ist dieser Kunde ein gutes Kreditrisiko" oder "welchen Rabatt sollte ich diesem Kunden für diese Bestellung geben" oder "Was ist der beste Kreuzverkauf für diesen Kunden zu diesem Zeitpunkt"? Diese Entscheidungsdienste können mithilfe eines Regelnmanagementsystems sehr effektiv erstellt werden und ermöglichen eine einfache Integration von Analysen im Laufe der Zeit, von denen viele Entscheidungen profitieren.

Ich sehe, dass Regel-, Prozess- und Datenmotoren (auch bekannt als Datenbanken) im Wesentlichen ähnlich sind. Aber aus irgendeinem Grund sagen wir nie, dass Blackboxing das Persistenz -Subsystem schlecht ist.

Zweitens ist ein anämisches Modell von meinem POV nicht eines, das leicht ist Implementierung von Verhaltensweisen ist es eines, das Licht in ist Verhalten selbst. Die tatsächliche Methode, die ein verfügbares Verhalten in einem Domänenmodellobjekt beschreibt, muss nicht vom Objekt selbst durchgeführt werden.

Die größte Komplexität meiner Erfahrung in Regelmotoren ist:

  1. Von OOP POV ist es ein echter Schmerz, in einer deklarativen Sprache zu repräsentieren und zu testen, während Sie Code refactorieren, der sie betrifft.
  2. Oft sollten wir immer über die Ausführungsreihenfolge der Regeln nachdenken, die sich in ein Chaos verwandelt, wenn es viele von ihnen gibt.
  3. Einige geringfügige Änderungen können ein falsches Verhalten von Regeln auslösen, die zu Produktionsfehler führen. In der Praxis ist es nicht immer möglich, alle Fälle mit Tests im Voraus abzudecken.
  4. Regeln mutierende Objekte, die in anderen verwendet werden, erhöhen auch die Komplexität, was den Entwicklern dazu veranlasst, sie in Stufen zu unterteilen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top