„Gopher hält die Regeln“
import "github.com/hyperjumptech/grule-rule-engine"
Grule ist eine Regel-Engine-Bibliothek für die Programmiersprache Go (Golang). Inspiriert von den gefeierten JBOSS Drools und auf viel einfachere Weise umgesetzt.
Wie Drools verfügt auch Grule über eine eigene DSL- oder domänenspezifische Sprache.
Unten finden Sie ein Beispiel für DRL oder Drools Rule Language von Drools:
rule "SpeedUp"
salience 10
when
$TestCar : TestCarClass( speedUp == true && speed < maxSpeed )
$DistanceRecord : DistanceRecordClass()
then
$TestCar.setSpeed($TestCar.Speed + $TestCar.SpeedIncrement);
update($TestCar);
$DistanceRecord.setTotalDistance($DistanceRecord.getTotalDistance() + $TestCar.Speed);
update($DistanceRecord);
end
Grules GRL lautet wie folgt:
rule SpeedUp "When testcar is speeding up we keep increase the speed." salience 10 {
when
TestCar . SpeedUp == true && TestCar . Speed < TestCar . MaxSpeed
then
TestCar . Speed = TestCar . Speed + TestCar . SpeedIncrement ;
DistanceRecord . TotalDistance = DistanceRecord . TotalDistance + TestCar . Speed ;
}
Es gibt keine bessere Erklärung als den Artikel von Martin Fowler. Sie können den Artikel hier lesen (RulesEngine von Martin Fowler).
Entnommen von der TutorialsPoint -Website (mit geringfügigen Änderungen),
Die Grule Rule Engine ist ein Produktionsregelsystem, das den regelbasierten Ansatz zur Implementierung eines Expertensystems verwendet. Expertensysteme sind wissensbasierte Systeme, die Wissensrepräsentationen verwenden, um erworbenes Wissen in einer Wissensdatenbank zu verarbeiten, die für Überlegungen verwendet werden kann.
Ein Produktionsregelsystem ist Turing mit einem Fokus auf Wissensrepräsentation, um Aussagenlogik und Logik erster Ordnung auf prägnante, eindeutige und deklarative Weise auszudrücken.
Das Gehirn eines Produktionsregelsystems ist eine Inferenzmaschine , die auf eine große Anzahl von Regeln und Fakten skaliert werden kann. Die Inferenz-Engine gleicht Fakten und Daten mit Produktionsregeln – auch Produktionen oder einfach nur Regeln genannt – ab, um Schlussfolgerungen abzuleiten, die zu Maßnahmen führen.
Eine Produktionsregel ist eine zweiteilige Struktur, die Logik erster Ordnung zum Denken über die Wissensrepräsentation verwendet. Eine Geschäftsregel-Engine ist ein Softwaresystem, das eine oder mehrere Geschäftsregeln in einer Laufzeit-Produktionsumgebung ausführt.
Mit einer Regel-Engine können Sie definieren , „was zu tun ist“ und nicht , „wie es zu tun ist“.
(ebenfalls entnommen aus TutorialsPoint)
Regeln sind Wissensbestandteile, die oft wie folgt ausgedrückt werden: „Wenn bestimmte Bedingungen eintreten, dann erledigen Sie einige Aufgaben.“
When
< Condition is true >
Then
< Take desired Action >
Der wichtigste Teil einer Regel ist ihr Wann-Teil. Wenn der Wenn -Teil erfüllt ist, wird der Dann -Teil ausgelöst.
rule < rule_name > < rule_description >
< attribute > < value > {
when
< conditions >
then
< actions >
}
Regeln machen es einfach, Lösungen für schwierige Probleme auszudrücken und auch Bestätigungen zu erhalten. Im Gegensatz zu Code werden Regeln in einer weniger komplexen Sprache geschrieben; Geschäftsanalysten können eine Reihe von Regeln leicht lesen und überprüfen.
Die Daten befinden sich in den Domänenobjekten und die Geschäftslogik befindet sich in den Regeln. Abhängig von der Art des Projekts kann diese Art der Trennung sehr vorteilhaft sein.
Durch die Verwendung von Regeln erstellen Sie ein ausführbares Wissensrepository (eine Wissensdatenbank). Es ist ein Single Point of Truth für die Geschäftspolitik. Im Idealfall sind Regeln so lesbar, dass sie auch als Dokumentation dienen können.
Da Geschäftsregeln tatsächlich als Daten behandelt werden. Die Anpassung der Regel an die dynamische Natur des Unternehmens wird trivial. Es ist nicht erforderlich, Code neu zu erstellen oder bereitzustellen, wie dies bei der normalen Softwareentwicklung der Fall ist – Sie müssen lediglich Regelsätze einführen und diese auf das Wissensrepository anwenden.
Die folgenden Fälle lassen sich besser mit einer Regel-Engine lösen:
Ein Expertensystem, das Fakten bewerten muss, um eine Schlussfolgerung aus der realen Welt zu ziehen. Wenn man keine Regel-Engine im RETE-Stil verwendet, würde man einen kaskadierenden Satz von if
/ else
-Anweisungen codieren, und die Permutationen der Kombinationen, wie diese ausgewertet werden könnten, wären schnell nicht mehr zu verwalten. Eine tabellenbasierte Regel-Engine könnte zwar ausreichen, ist aber noch anfälliger gegenüber Änderungen und lässt sich nicht besonders einfach programmieren. Ein System wie Grule ermöglicht es Ihnen, die Regeln und Fakten Ihres Systems zu beschreiben, entbindet Sie von der Notwendigkeit zu beschreiben, wie die Regeln anhand dieser Fakten bewertet werden, und verbirgt Ihnen den Großteil dieser Komplexität.
Ein Bewertungssystem. Beispielsweise möchte ein Banksystem möglicherweise für jeden Kunden einen „Score“ erstellen, der auf den Transaktionsdatensätzen (Fakten) des Kunden basiert. Wir konnten sehen, dass sich ihre Punktzahl veränderte, je nachdem, wie oft sie mit der Bank interagieren, wie viel Geld sie ein- und auszahlen, wie schnell sie ihre Rechnungen bezahlen, wie viel Zinsen sie anfallen, wie viel sie für sich selbst oder für die Bank verdienen usw bald. Eine Regel-Engine könnte von einem Entwickler bereitgestellt werden, und die Spezifikation der Fakten und Regeln kann dann von Fachexperten in der Kundenanalyseabteilung der Bank bereitgestellt werden. Durch die Entkopplung dieser verschiedenen Teams werden die Verantwortlichkeiten dorthin gebracht, wo sie sein sollten.
Computerspiele. Spielerstatus, Belohnungen, Strafen, Schaden, Punkte und Wahrscheinlichkeitssysteme sind viele verschiedene Beispiele dafür, dass Regeln in den meisten Computerspielen eine wichtige Rolle spielen. Diese Regeln können auf sehr komplexe Weise interagieren, oft auf eine Weise, die der Entwickler nicht vorhergesehen hat. Das Codieren dieser dynamischen Situationen mithilfe einer Skriptsprache (z. B. Lua) kann recht komplex werden, und eine Regel-Engine kann dabei helfen, die Arbeit enorm zu vereinfachen.
Klassifizierungssysteme. Dabei handelt es sich eigentlich um eine Verallgemeinerung des oben beschriebenen Bewertungssystems. Mithilfe einer Regel-Engine können wir Dinge wie Kreditwürdigkeit, biochemische Identifizierung, Risikobewertung für Versicherungsprodukte, potenzielle Sicherheitsbedrohungen und vieles mehr klassifizieren.
Beratungs-/Vorschlagssystem. Eine „Regel“ ist einfach eine andere Art von Daten, was sie zu einem erstklassigen Kandidaten für die Definition durch ein anderes Programm macht. Dieses Programm kann ein anderes Expertensystem oder künstliche Intelligenz sein. Regeln können von anderen Systemen manipuliert werden, um mit neuen Arten von Fakten oder neu entdeckten Informationen über die Domäne umzugehen, die der Regelsatz modellieren möchte.
Es gibt viele andere Anwendungsfälle, die vom Einsatz einer Rule-Engine profitieren würden. Die oben genannten Fälle stellen nur einen kleinen Teil der möglichen Fälle dar.
Es ist jedoch wichtig zu bedenken, dass eine Rule-Engine natürlich kein Allheilmittel ist. Es gibt viele Alternativen zur Lösung von „Wissensproblemen“ in Software, und diese sollten dort eingesetzt werden, wo sie am besten geeignet sind. Man würde keine Regel-Engine verwenden, bei der beispielsweise ein einfacher if
/ else
-Zweig ausreichen würde.
Es gibt noch etwas zu beachten: Einige Regel-Engine-Implementierungen sind extrem teuer, doch viele Unternehmen profitieren von ihnen so sehr, dass die Betriebskosten leicht durch diesen Wert ausgeglichen werden. Selbst bei mäßig komplexen Anwendungsfällen scheint der Vorteil einer starken Regel-Engine, die Teams entkoppeln und die Geschäftskomplexität bändigen kann, ganz klar zu sein.
Dokumentationsseite hier
Um in das Tutorial einzutauchen, sehen Sie sich die Wiki-Dokumente hier auf Github an.
Loading rules into KnowledgeBase
:
Um 100
Regeln in KnowledgeBase zu laden, waren 99342047 ns/op
(höchster Wert) erforderlich, was ~99.342047ms
und ( 49295906 B/op
) ~49.295906MB
Speicher pro Vorgang entspricht
Um 1000
Regeln in die KnowledgeBase zu laden, waren 933617752 ns/op
(höchster Wert) erforderlich, was ~933.617752ms
und ( 488126636 B/op
) ~488.126636
Speicher pro Vorgang entspricht
Executing rules against a fact
:
Um einen Fakt anhand von 100 Regeln auszuführen, benötigte die Grule Engine ~9697 ns/op
(wobei der höchste Wert als Basis verwendet wurde), also kaum ~0.009697ms
und 3957 B/op
, was ziemlich schnell ist.
Um einen Fakt anhand von 1000 Regeln auszuführen, benötigte die Grule Engine ~568959 ns/op
(wobei der höchste Wert als Basis verwendet wurde), also kaum ~0.568959ms
und 293710 B/op
, was ebenfalls ziemlich schnell ist.
Den Detailbericht können Sie hier lesen
Ja. Wir brauchen Mitwirkende, um Grule noch besser und nützlicher für die Open-Source-Community zu machen.
Wenn Sie uns wirklich helfen möchten, Fork
einfach das Projekt und beantragen Sie Pull Request. Bitte lesen Sie unser Beitragshandbuch und unseren Verhaltenskodex