「ゴーファーはルールを守る」
import "github.com/hyperjumptech/grule-rule-engine"
Grule は、 Go (Golang) プログラミング言語用のルール エンジン ライブラリです。高く評価されている JBOSS Drools からインスピレーションを得たもので、よりシンプルな方法で実現されています。
Droolsと同様に、 Grule には独自のDSLまたはドメイン固有言語があります。
以下は Drools の DRL または 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
Grule の GRL は次のとおりです。
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 ;
}
Martin Fowler が執筆した記事より適切な説明はありません。ここで記事を読むことができます (Martin Fowler による RulesEngine)。
TutorialsPoint Web サイトから抜粋 (わずかに変更)、
Gruleルール エンジンは、ルールベースのアプローチを使用してエキスパート システムを実装するプロダクション ルール システムです。エキスパート システムは、知識表現を使用して取得した知識を推論に使用できる知識ベースに処理する知識ベースのシステムです。
生産ルール システムは、命題論理と一次論理を簡潔で曖昧さのない宣言的な方法で表現するための知識表現に焦点を当ててチューリングによって完成されました。
プロダクション ルール システムの頭脳は、多数のルールとファクトに拡張できる推論エンジンです。推論エンジンは、事実とデータをプロダクション ルール (プロダクションまたは単にルールとも呼ばれます) と照合して、アクションにつながる結論を推測します。
プロダクション ルールは、知識表現に対する推論に 1 次ロジックを使用する 2 つの部分からなる構造です。ビジネス ルール エンジンは、ランタイム運用環境で 1 つ以上のビジネス ルールを実行するソフトウェア システムです。
ルール エンジンを使用すると、「方法」ではなく「何を行うか」を定義できます。
(これも TutorialsPoint から引用)
ルールとは、「ある条件が発生したら、あるタスクを実行する」という形で表現されることが多い知識です。
When
< Condition is true >
Then
< Take desired Action >
ルールの最も重要な部分は、その when 部分です。 when部分が満たされると、 then部分がトリガーされます。
rule < rule_name > < rule_description >
< attribute > < value > {
when
< conditions >
then
< actions >
}
ルールを使用すると、困難な問題に対する解決策を簡単に表現したり、検証を取得したりすることができます。コードとは異なり、ルールはそれほど複雑ではない言語で記述されます。ビジネス アナリストは、一連のルールを簡単に読んで検証できます。
データはドメイン オブジェクトに存在し、ビジネス ロジックはルールに存在します。プロジェクトの種類によっては、この種の分離が非常に有利になる場合があります。
ルールを使用すると、実行可能なナレッジのリポジトリ (ナレッジ ベース) を作成できます。これはビジネス ポリシーの単一の真実点です。理想的には、ルールは非常に読みやすく、ドキュメントとしても機能します。
ビジネスルールは実際にはデータとして扱われるためです。ビジネスの動的な性質に応じてルールを調整するのは簡単になります。通常のソフトウェア開発のようにコードを再構築したり展開したりする必要はありません。ルールのセットをロールアウトしてナレッジ リポジトリに適用するだけで済みます。
次のケースは、ルール エンジンを使用した方が適切に解決されます。
現実世界における何らかの結論を提供するために事実を評価する必要があるエキスパート システム。 RETE スタイルのルール エンジンを使用しない場合は、 if
/ else
ステートメントのカスケード セットをコード化することになり、それらの評価方法の組み合わせの順列はすぐに管理できなくなります。テーブルベースのルール エンジンで十分かもしれませんが、それでも変更に対して脆弱であり、コーディングはそれほど簡単ではありません。 Grule のようなシステムを使用すると、システムのルールと事実を記述することができるため、それらの事実に対してルールがどのように評価されるかを記述する必要性から解放され、その複雑さの大部分を隠すことができます。
評価システム。たとえば、銀行システムは、顧客の取引記録 (事実) に基づいて各顧客の「スコア」を作成したい場合があります。彼らのスコアは、銀行とのやり取りの頻度、送金の金額、請求書の支払いの早さ、利息の額、自分自身または銀行の収入に基づいて変化することがわかりました。すぐ。ルール エンジンは開発者によって提供され、事実とルールの仕様は銀行の顧客分析部門内の主題専門家によって提供されます。これらの異なるチームを分離すると、責任は本来あるべき場所に置かれます。
コンピューターゲーム。プレイヤーのステータス、報酬、ペナルティ、ダメージ、スコア、確率システムなど、ほとんどのコンピューター ゲームでルールが重要な役割を果たすさまざまな例が数多くあります。これらのルールは非常に複雑な方法で相互作用する可能性があり、多くの場合、開発者が予期しない方法で相互作用します。スクリプト言語 (Lua など) を使用してこれらの動的な状況をコーディングすると、非常に複雑になる可能性がありますが、ルール エンジンは作業を大幅に簡素化するのに役立ちます。
分類システム。これは実際には、上で説明した評価システムを一般化したものです。ルール エンジンを使用すると、信用適格性、生化学的識別、保険商品のリスク評価、潜在的なセキュリティ脅威などを分類できます。
アドバイス/提案システム。 「ルール」は単なる別の種類のデータであり、別のプログラムによる定義の主な候補になります。このプログラムは、別のエキスパート システムまたは人工知能である可能性があります。ルールは、ルールセットがモデル化しようとしているドメインに関する新しいタイプの事実や新たに発見された情報を処理するために、他のシステムによって操作できます。
ルールエンジンの使用から恩恵を受けるユースケースは他にもたくさんあります。上記のケースは、可能性のあるケースのうちの少数にすぎません。
ただし、もちろん、ルール エンジンは特効薬ではないことを覚えておくことが重要です。ソフトウェアの「知識」問題を解決するには多くの代替手段が存在しており、それらは最も適切な場合に使用する必要があります。たとえば、単純なif
/ else
分岐で十分なルール エンジンは使用しません。
もう 1 つ注意すべき点があります。一部のルール エンジンの実装は非常に高価ですが、多くの企業はそれらから非常に多くの価値を得ているため、ルール エンジンの実行コストはその価値によって簡単に相殺されます。中程度に複雑なユースケースであっても、チームを分離し、ビジネスの複雑さを抑制できる強力なルール エンジンの利点は、非常に明らかであるようです。
ドキュメントページはこちら
チュートリアルの詳細については、Github の Wiki Docs を参照してください。
Loading rules into KnowledgeBase
:
100
ルールをナレッジベースにロードするには99342047 ns/op
(最高値を取得) かかりました。これは、 ~99.342047ms
と、操作ごとに ( 49295906 B/op
) ~49.295906MB
メモリに相当します。
1000
ルールをナレッジベースにロードするには、 933617752 ns/op
(最高値を取得) かかりました。これは、 ~933.617752ms
と、操作ごとに ( 488126636 B/op
) ~488.126636
メモリに相当します。
Executing rules against a fact
:
100 のルールに対してファクトを実行する場合、Grule エンジンは~9697 ns/op
(ベースとして最高値を取得) かかりましたが、これは~0.009697ms
とは思えず、 3957 B/op
とかなり高速です。
1000 のルールに対してファクトを実行するのに、Grule エンジンは~568959 ns/op
(ベースとして最高値を取得) かかりました。これはおよそ~0.568959ms
とは思えず、 293710 B/op
もかなり高速です。
詳細レポートはここで読むことができます
はい。 Grule をさらに改善し、オープンソース コミュニティにとって役立つものにするための貢献者が必要です。
本当に私たちを支援したい場合は、プロジェクトFork
てプル リクエストを申請してください。貢献マニュアルと行動規範をお読みください。