2

C ++ルールエンジンはXMLでルールを定義し、各ルールは「if X、then Y」に要約されます。ここで、Xは一連のテストであり、Yは一連のアクションです。C ++コードでは、テスト/アクションで使用できる「関数」は、「関数」ごとにクラスとして作成され、それぞれに「run(args)」メソッドがあります...それぞれが独自のパラメーターのセットを取ります。

これは正常に機能します。

ただし、ユーザーがXMLを手作りするのを防ぐために別のツールが必要です。ルールエンジンはプログラマー以外を対象としています。ツールは、使用可能なすべての「関数」と、それらに必要な入力パラメーターを知っている必要があります。これを行うことを検討するための最良の方法は何ですか?私はいくつかの可能性を考えました:

  1. 構成ファイルには、「関数」とそのパラメーターが記述されており、ツールによって読み取られます。これは非常に簡単で、実際のC ++コードはこれを使用して引数の検証を実行できますが、それでもC ++とXMLの同期は保証されません。プログラマーは、C ++を変更し、XMLの更新を忘れて検証のバグが発生する可能性があります。
  2. 各「関数」クラスには、それを記述するメソッドがあります。どういうわけか、ツールはC ++クラスをロードします...これはリフレクションをサポートする言語では簡単ですが、C ++では厄介です。おそらく、すべての「関数」などを備えた特別なDLLを作成する必要があります。これは余分なオーバーヘッドを意味します。

特にC++の性質を考えると、何が理にかなっていますか?

編集:タイトルは説明的ですか?これ以上良いものは考えられません。

4

2 に答える 2

2

3番目の方法があります-IDL。

クライアントサーバーアプリがあり、クライアントとサーバーにデプロイできるラッパークラスを生成するコードジェネレーターがあるとします。これにより、ユーザーはクライアントAPIを使用してアプリを作成でき、サーバーで処理が行われます。典型的なRPCシナリオであり、DCE-RPC、ONC-RPC、CORBA、COMなどで使用されます。

ここでの秘訣は、クライアントが呼び出すことができるメソッドのシグネチャを定義することです。これは、インターフェイス定義言語で行われます。これは難しいことではありませんが、クライアント/サーバーAPIのソースであり、ジェネレーターを介して実行し、クライアントが使用できるようにコンパイルするC++クラスを生成します。

あなたの場合、XMLはIDLのように聞こえます。そのため、XMLを取得し、コードが公開する関数を説明するC++ヘッダーを生成するツールを作成できます。実際にはcppファイルを生成する必要はありませんが(可能です)、ヘッダーを生成する方が簡単なので、新しい関数/パラメーターを追加するプログラマーは、実装を更新することを忘れることはできません-ヘッダーが一度コンパイルされるとコンパイルされません再生成されました。

関数定義以外にもある場合は、既存のc++ヘッダーに#includeされるヘッダーを生成できます。

だから-それは私の提案です、#3:あなたの決定的なXML署名から定義を生成します。

于 2010-01-10T23:57:13.103 に答える
0

もう1つの方法があります:

  • 関数呼び出しで引数の型が均一であるという制約を追加します。
  • 引数の最大数を定義する
  • タイプと優先順位を説明します。つまり、double変換しStringますが、その逆は行いません。

その後、あなたは持っています

void f(int a1) .. f(int a1 .. int aN)
void f(double a1) .. f(double a1 .. double aN)
..
void f(T a1) .. 

そして、文字列、日付などの他の具体的なデータ型。

利点:

  • 署名のバリエーションは固定および通常
  • 「最大」型の署名(T)のみを提供することが可能です
  • テンプレートと言語ブリッジでうまく機能します
  • 未定義の2つの整数パラメータでアクションfに警告できます
于 2010-01-11T00:36:33.600 に答える