Rules Engine と呼ばれるものを使用するプロジェクトを監査しています。つまり、アプリケーションコードからビジネスロジックを外部化する方法です。
この概念は私にとってまったく新しいものであり、私はそれについてかなり懐疑的です。過去数年間、人々が Anemic Domain Models について話しているのを聞いた後、Rules Engineアプローチに疑問を呈しています。私にとって、それらはドメインモデルを解放する素晴らしい方法のように思えます。たとえば、Java webappとRules Engineとの対話を行っています。その後、同じドメインに基づいてAndroidアプリを使用することにします。 AndroidアプリもRules Engineとやり取りしたい場合を除き、ビジネスロジックが既に記述されているものを逃す必要があります。
まだ好奇心だけで、まだ経験がないので、ルールエンジンを使用することの長所と短所について聞きたいと思いましたか?私が考えることができる唯一の長所は、いくつかのビジネスルールを変更するためだけにアプリケーション全体を再構築する必要がないということです(実際、いくつのアプリが実際にそのような変更を持っているのでしょうか?)。しかし、Rules Engineを使用して、散弾銃の傷にバンドエイドをかけるような音の問題を解決します。
更新-これを書いて以来、神自身、Martin Fowlerは Rulesエンジンの使用についてのブログ を持っています。
私が見たほとんどのルールエンジンは、システムコードではブラックボックスと見なされます。ドメインモデルを作成する場合、特定のビジネスルールをドメインモデルに固有のものにしたいでしょう。オブジェクトに無効な値がある場合に通知するビジネスルール。これにより、ビジネスロジックを複製することなく、複数のシステムでドメインモデルを共有できます。各システムに同じルールサービスを使用してドメインモデルを検証させることもできますが、これはドメインモデルを弱めるように見えます(質問で指摘したように)。どうして?常にすべてのシステムでビジネスルールを一貫して実施するのではなく、システムプログラマーに頼って(ルールサービスを呼び出して)ビジネスルールを実施するタイミングを決定しているためです。ドメインモデルが完全に読み込まれた場合、これは問題にならないかもしれませんが、ドメインモデルの値をその存続期間にわたって変更するユーザーインターフェイスまたはシステムを扱っている場合は問題になる可能性があります。
ビジネスルールには、意思決定という別のクラスがあります。たとえば、保険会社は、申請者を引き受けるリスクを分類し、保険料を支払う必要がある場合があります。これらのタイプのビジネスルールをドメインモデルに配置することもできますが、通常、このようなシナリオの一元的な決定が望ましく、実際にはサービス指向アーキテクチャに非常によく適合しています。これは、なぜシステムコードではなくルールエンジンなのかという疑問を抱いています。ルールエンジンの方が適している可能性があるのは、意思決定を担当するビジネスルールが時間とともに変化する場所です(他のいくつかの回答が指摘しているように)。
通常、ルールエンジンを使用すると、システムを再起動したり、新しい実行可能コードを展開したりせずにルールを変更できます(ベンダーからの約束に関係なく、ルールエンジンに問題がない場合でも、非運用環境で変更をテストしてください) 、人間はまだルールを変更しています)。 「データベースを使用して、変化する値を保存することでそれができる」と考えているなら、あなたは正しい。ルールエンジンは、何か新しいことをする魔法の箱ではありません。より高いレベルの抽象化を提供するツールであるため、ホイールの再発明にあまり集中できません。多くのベンダーは、テンプレートを作成して、ビジネスユーザーがルール言語を学習する代わりに空白を埋めることができるようにすることで、これをさらに一歩進めています。
テンプレートに関する注意点の1つは、テンプレートは少なくともテンプレートを使用してルールを記述する必要があるためです。より高い初期コストを計画します(データベースコードを使用して、変更する値を格納するシステムを構築する場合と、システムコードに直接ルールを記述する場合と同じ)-ROIは、システムコードの将来のメンテナンスを節約するためです。
貧血領域モデルについてのあなたの懸念は有効だと思います。
私が働いている実稼働環境で実行されている有名な商用Reteルールエンジンの2つのアプリケーションを見てきました。 1つは成功、もう1つは失敗だと思います。
成功するアプリケーションは、それぞれが〜30の分岐点を持つ〜10個のツリーで構成される決定木アプリです。ルールエンジンには、ビジネス関係者がルールを維持できるUIがあります。
あまり成功していないアプリケーションには、〜3000のルールがルールデータベースに非難されています。新しいルールが追加されたときに競合するルールがあるかどうかは誰にもわかりません。 Reteアルゴリズムについてはほとんど理解されておらず、製品に関する専門知識が会社を去ったため、手に負えず、リファクタリングできないブラックボックスになりました。展開サイクルは依然としてルールの変更の影響を受けます。ルールが変更された場合、完全な回帰テストを実行する必要があります。メモリも問題でした。
軽く踏みます。ルールセットのサイズが控えめな場合、上記の単純な電子メールサンプルのように、変更を理解するのは簡単です。ルールの数が数百に達すると、問題があるかもしれません。
また、ルールエンジンがアプリケーションのシングルトンボトルネックになることも心配です。
エンジン空間を支配するパーティション分割の方法としてオブジェクトを使用することに何の問題もない。プライベートルールエンジンに従うオブジェクトに動作を埋め込むことは、私には問題ないようです。ルールエンジンが、オブジェクトの一部ではない状態を適切に起動する必要がある場合、問題が発生します。しかし、それは設計が難しい別の例にすぎません。
ルールエンジンは、特定のインスタンスで多くの価値を提供できます。
まず、多くのルールエンジンはより宣言的な方法で機能します。非常に粗雑な例は、コードブロックに正規表現を割り当てることができるAWKです。正規表現がファイルスキャナで認識されると、コードブロックが実行されます。
この場合、たとえば大きなAWKファイルがあり、さらに別の「ルール」を追加したい場合は、ファイルの一番下に簡単に移動し、正規表現とロジックを追加して、それ。特に、多くのアプリケーションでは、他のルールが何をしているのかを特に気にする必要はなく、ルールは実際には相互運用しません。
したがって、AWKファイルは「ルールスープ」のようになります。この「ルールスープ」の性質により、人々は、システムに存在する可能性のある他のすべてのルールをほとんど気にすることなく、自分のドメインに非常に厳密に集中することができます。
たとえば、フランクは合計$ 1000を超える注文に関心があるため、興味のあるルールシステムに参加します。 「IF order.total> 1000 THEN emailフランク」。
一方、サリーは西海岸からのすべての注文を求めています:「IF order.source == 'WEST_COAST' THEN email Sally」。
したがって、この些細で不自然なケースでは、順序は両方のルールを満たすことができますが、両方のルールは互いに独立していることがわかります。西海岸からの1200ドルの注文は、フランクとサリーの両方に通知します。フランクが心配しなくなったとき、彼は単純にスープからルールを削除します。
多くの場合、この柔軟性は非常に強力です。この場合のように、単純なルールのためにエンドユーザーに公開することもできます。高レベルの式とおそらく軽量のスクリプトを使用します。
さて、明らかに、複雑なシステムではあらゆる種類の相互関係が発生する可能性があります。これが、システム全体が「ルールの完了」ではない理由です。誰かが、どこかで手に負えないルールを担当するつもりです。しかし、それは必ずしもそのようなシステムが提供できる価値を低下させるわけではありません。
これは、ルールが作成できるデータに対してルールが発動するエキスパートシステムのようなものには入らないが、よりシンプルなルールシステムには入らないことに注意してください。
とにかく、この例が、ルールシステムがより大きなアプリケーションの拡張にどのように役立つかを示すことを期待しています。
ルールエンジンで私が見た最大の利点は、プログラマに負担をかける代わりに、ビジネスルールの所有者がビジネスルールを実装できることです。利害関係者から絶えずフィードバックを受け取り、迅速な反復を行っているアジャイルプロセスがある場合でも、ビジネスルールを作成する人々にそれらを実装させることで達成できる効率レベルを達成することはできません。
また、ルールがコードに埋め込まれている場合、単純なルール変更の結果として発生する可能性があるrecompile-retest-redeployサイクルを削除する際に、値を強調しすぎることはできません。多くの場合、ビルドに祝福をかけることに関与しているチームがいくつかあり、Rules Engineを使用すると、その多くが不要になります。
クライアント用のルールエンジンを作成しました。最大の勝利は、すべての利害関係者を含むことでした。エンジンはクエリを実行(またはリプレイ)し、テキストで何が起こっているかを説明できます。ビジネスの人々は、テキストの説明を見て、ルール、例外、およびその他の特殊なケースのニュアンスをすばやく指摘できます。ビジネス側が関与すると、入力を取得するのが簡単だったため、検証はずっと良くなりました。さらに、ルールエンジンは、アプリケーションコードベースの他の部分とは別個に使用できるため、アプリケーション全体で使用できます。
短所は、一部のプログラマーはあまり学びたくないということです。ルールエンジンとそれらに配置するルール、およびそれらを実装するものは、少々毛深いものです。優れたシステムは、病気やねじれたロジックのウェブ(またはillogicの場合が多い)を簡単に処理できますが、多くのif
ステートメントをコーディングするほど単純ではありません(単純なルールのエンジンの一部に関係なく) 。ルールエンジンは、ルールの関係を処理するツールを提供しますが、それでもすべてを頭の中で想像できる必要があります。映画に住んでいるようなこともありますブラジル。 :)
それは(他のすべてと同様に)アプリケーションに依存します。一部のアプリケーション(通常は変更されないか、ルールが実生活の定数で最適です。つまり、物理的特性や式など、長年にわたって顕著に変更されません)では、ルールエンジンを使用しても意味がありません。さらに複雑になり、開発者はより大きなスキルセットを持つ必要があります。
他のアプリケーションでは、本当に良いアイデアです。たとえば、注文処理(注文は請求から通貨取引の処理まで)で、関連する法律またはコード(司法の意味で)にわずかな変更があり、新しい要件(売上税など)を満たす必要があります。 、クラシック)。古いアプリケーションを、消費税について突然考えなければならないこの新しい状況に強制しようとするのではなく、以前はそうでなかったように、潜在的に大規模に干渉するよりもルールセットを調整する方が簡単ですコードのセット。
次に、地方自治体からの次の修正では、特定の基準内ですべての売上を報告する必要があります。そのため、それを追加して追加する必要はありません。最終的には、非常に複雑なコードになります。このコードは、他のすべてに影響を与えずに、ルールの1つを無効にしたい場合に、管理が非常に難しいことがわかります...
これまで誰もがルールエンジンについて非常に前向きでしたが、読者には用心してください。問題がもう少し複雑になると、ルールエンジン全体が不適切になった、またはより強力な言語よりもはるかに複雑になったことが突然わかる場合があります。また、多くの問題について、ルールエンジンは、状態を評価する実行時間とメモリフットプリントを大幅に削減するプロパティを簡単に検出できません。依存性注入フレームワークやより動的なプログラミング言語よりもルールエンジンを好む状況は比較的少ないです。
「しかし、実際には、いくつのアプリがそんなに多くの変更を加えているのでしょうか?」
正直なところ、私が取り組んできたすべてのアプリは、展開からかなりの期間まで、概念から重大なワークフローやロジックの変更を経験しました。それが「メンテナンス」プログラミングの最大の理由です...
現実には、すべてを前もって考えることはできないため、アジャイルプロセスの理由です。さらに、学士号はテストで見つかるまで、常に重要なものを見逃しているようです。
ルールエンジンを使用すると、プレゼンテーションとストレージからビジネスロジックを完全に分離する必要があります。さらに、適切なエンジンを使用している場合、BAは必要に応じてロジックを追加および削除できます。 Chris Marasti-Georgが言ったように、それはBAに責任を負います。しかしそれ以上に、BAは彼らが求めているものを正確に得ることができます。
すでに多くの良い答えがありますが、いくつかのことを追加したいと思いました。
ルールエンジンは、回避できる場合はカスタムビルドを行う必要がない構成可能なアプリケーションの利点です。また、 Rete のようなルールおよびアルゴリズムの大規模なベースを一元化することにも優れており、大規模なルールセットに対する迅速なマッチングに効率的です。
ルール、プロセス、およびデータエンジン(別名データベース)は本質的に類似していると思います。しかし、何らかの理由で、永続サブシステムのブラックボックス化が悪いとは決して言いません。
第二に、私のPOVから、貧血モデルは行動の実装が軽いモデルではなく、動作自体が軽いモデルです。ドメインモデルオブジェクトで利用可能な動作を記述する実際のメソッドは、オブジェクト自体で実行する必要はありません。
ルールエンジンでの私の経験からの最大の複雑さは、次のとおりです。