【问题标题】:C++ functions exposed to scripting system - self-describing parameter types暴露给脚本系统的 C++ 函数 - 自描述参数类型
【发布时间】:2010-01-10 23:46:10
【问题描述】:

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

这很好用。

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

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

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

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

【问题讨论】:

    标签: c++ xml rule-engine


    【解决方案1】:

    还有第三种方式 - IDL。

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

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

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

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

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

    【讨论】:

    • 这是一个有趣的想法。我有点倒退了,说 C++ 可以使用 XML 进行验证,你的方式更整洁。我在 COM 中使用过 IDL,虽然它有点痛苦,但它可能是最不痛苦的方法。
    • IDL 不必是“IDL”,IDL 只是您编写定义所用语言的术语。在您的情况下,它是您的 XML 架构。
    【解决方案2】:

    还有另一种方法:

    • 在函数调用中添加参数类型统一的约束。
    • 定义一些最大参数数
    • 描述类型和优先级,即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)
    • 适用于模板和语言桥
    • 可以警告 动作 f 带有 2 个未定义的整数参数

    【讨论】:

    • “在函数调用中添加一个参数类型统一的约束”......这将使 IMO 语言变得非常糟糕。不得不编写 XML 伪语言已经够糟糕了,但我至少可以尝试使底层框架灵活:)
    猜你喜欢
    • 2010-12-01
    • 2019-07-31
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2010-12-05
    • 2019-04-01
    相关资源
    最近更新 更多