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

这很好用。

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

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

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

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

有帮助吗?

解决方案

还有第三种方法 - IDL。

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

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

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

如果现有的 C++ 头文件中不仅仅有函数定义,您可以生成一个#included 头文件。

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

其他提示

还有另一种方法:

  • 添加一个约束,即函数调用中的参数类型必须一致。
  • 定义一些最大参数数
  • 描述类型和优先级,即 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 未定义
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top