2

C++ 规则引擎在 XML 中定义规则,其中每个规则归结为“如果 X,则 Y”,其中 X 是一组测试,Y 是一组动作。在 C++ 代码中,可用于测试/动作的“函数”被创建为每个“函数”的类,每个函数都有一个“run(args)”方法……每个都有自己的一组参数。

这工作正常。

但是,需要一个单独的工具来节省用户手工制作的 XML;规则引擎是针对非程序员的。该工具需要知道所有可用的“功能”,以及它们所需的输入参数。考虑这样做的最佳方法是什么?我考虑了几种可能性:

  1. 配置文件描述了“功能”及其参数,并由工具读取。这很简单,实际的 C++ 代码可以使用它来执行参数验证,但仍然不能保证 C++ 和 XML 同步 - 程序员可能会修改 C++ 而忘记更新 XML,从而导致验证错误
  2. 每个“功能”类都有描述它的方法。不知何故,该工具加载了 C++ 类......这在支持反射的语言中很容易,但在 C++ 中更混乱,可能你必须构建一个包含所有“函数”或其他东西的特殊 DLL。这意味着额外的开销。

考虑到 C++ 的性质,什么是有意义的?

编辑:标题是描述性的吗?我想不出更好的了。

4

2 回答 2

2

还有第三种方式 - IDL。

想象一下,您有一个客户端-服务器应用程序,并且您有一个代码生成器,它生成可以部署在客户端和服务器上的包装类,以便用户可以使用客户端 API 编写应用程序,并且处理发生在服务器上......这是典型的 RPC 场景,用于 DCE-RPC、ONC-RPC、CORBA、COM 等。

这里的技巧是定义客户端可以调用的方法的签名,这是在接口定义语言中完成的。这并不难,但它是客户端/服务器 API 的源代码,您通过生成器运行它,它会生成您编译的 C++ 类供客户端使用。

在您的情况下,听起来 XML 是 IDL。因此您可以创建一个工具来获取 XML 并生成描述您的代码公开的函数的 C++ 标头。您实际上不必生成 cpp 文件(您可以),但只生成标头更容易,因此添加新函数/参数的程序员不会忘记更新实现 - 一旦标头就不会编译已重新生成。

如果除了函数定义之外还有更多内容,您可以生成 #included 到现有 c++ 标头中的标头。

所以 - 这是我的建议,#3:从您的最终 XML 签名生成定义。

于 2010-01-10T23:57:13.103 回答
0

There is one other way:

  • Add a constraint that the argument types be uniform in a function call.
  • define some max number of arguments
  • describe the types and the precedence i.e. double converrts to String but not vice-versa

then you have

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

And other concrete data types like String, Date, etc.

Advantages:

  • Variations in signature fixed and regular
  • it's possible to only provide the "biggest" type signature (T)
  • works well with templates and language bridges
  • can warn action f with 2 Integer parameters undefined
于 2010-01-11T00:36:33.600 回答