web-dev-qa-db-ja.com

ユーザーが独自の論理条件を指定できるようにするにはどうすればよいですか?

私はJEEプロジェクトに取り組んでいます、これが状況です:

私はメーカー/チェッカーの財務概念を置くアプリケーションを持っています。メーカーは操作を選択してその値を変更できますが、チェッカーはこれらの変更を承認して登録できるようにする必要があります。問題は、特定のチェッカーを選択する必要がある特定の条件が設定されている操作があるため、これらの条件はメーカーによって変わる可能性があります。 Javaこれらの条件を、アプリケーションへの入力であるということだけを知らずにコーディングする際に、どのように考慮することができますか?

部外者のユーザーが作成した条件をコーディングする方法を簡単に説明しますか?

例:

  • 操作:信用状態:

    if(card.equals("normal")) credit = 500 ;

    メーカーは、通常のカードを持っていて、ユーザーが20歳未満の場合、クレジット= 500という別の条件を追加することをお勧めします。したがって、メーカーは条件を変更していますが、アプリケーションにアクセスできませんが、アプリケーションはこの変更を考慮に入れる必要があります。誰かがこれを実装する方法を知っていますか?

1
Elias

このタスクは、3つの異なるサブタスクと見なすことができます。条件の指定方法を定義する必要があります。条件の表現が必要です。そして、それをプログラムに統合する必要があります。

条件の指定方法

ユーザーがプログラミングできない限り、DSL(ドメイン固有言語)が必要なようです。開発者が条件とアクションを作成するか、ドメインの専門家が作成するのを支援する場合、ここでは「ルール」と呼びますが、おそらくテキストで行うことができます。スクリプト言語を使用する場合の1つのオプションは、実際にその言語で糖衣構文を使用してルールを作成することです。ただし、Javaを使用しているため、Javaをコンパイルする必要があります。たとえば、言語は次のようになります。

IF card = normal AND years < 20 THEN set credit = 500

上記のスニペットには多くのコンテキストがあります。曖昧になるのを避けることができれば、それは言語をかなり単純にすることができます。たとえば、私たちが以前に話しているのは誰の「年」ですか?ルールがカードのコンテキストで評価されている場合、それはカードの所有者です。しかし、明確でない場合は、言語をもっと複雑にする必要があるかもしれません。 'years(owner(card))'、そしてあなたはparnthesesで普通のユーザーを怖がらせ始めるかもしれません。

条件を作成するのが開発者でない場合は、言語に関するグラフィカルツールを強く検討する必要があります。グラフィカルツールは、たとえばスペルミスを回避するためにオプションを制約し、ユーザーを利用可能なオプションに導くことができます。

セマンティックモデル

言語の正式なモデルを用意します。これは、式の抽象構文木である可能性があります。また、ルートは、条件ノードとアクションノードの2つの子を持つノードです。次に、あるコンテキストのルールを評価するために、ユーザーが定義したすべてのルールを見つけ、抽象構文ツリーを使用してそれを評価し、条件が真である場合は、アクションを実行します。競合を処理するためにルールを解釈することもできます。たとえば、「カードが正常で、ユーザーの年齢が15歳未満の場合、クレジットを300に設定する」という別のルールがある場合はどうなりますか?これで両方のルールが適用されますが、それが望ましくない場合は、ユーザーに通知できます。ただし、言語が強力すぎる場合、これは決定不能になる可能性があることに注意してください。つまり、そのような競合をすべて検出することはできません。

上記のスニペットは、次のような抽象構文ツリーになる可能性があります。

                  ________________RULE____
                 /                        \
               AND                     ACTIONS
        ______/   \______                 |
       /                 \              _SET_
    _ = _              _ < _           /     \
   /     \            /     \      credit    500
card    normal      age     20

通訳

インタプリタまたはセマンティックモデルを実装する必要があります。これにより、所有しているデータに対してモデルが「実行」されます。たとえば、システム内の現在のデータを使用して、セマンティックモデルによって記述された条件を確認してから、データを更新する適切なアクションを実行します。

たとえば、setNodeを処理するための擬似コードは次のようになります。

onVisitSet(SetNode setNode, CardContext context) {
    if (setNode.assignType == CARD) {
        Account account = context.getAccountForCard();
        account.setBalance(500);
    } else if (...)
    //....
}

実際の銀行は単にバランスを「設定」するだけではありませんが、覚えておいてください。

2
senevoldsen