在c ++中即时添加过滤功能

时间:2011-03-03 07:44:11

标签: c++ on-the-fly

我有以下(简化)架构:

客户端 - >保镖 - >服务器

客户端向服务器发送命令。 'bouncer'对客户端发出的命令执行完整性和其他检查,并防止错误命令到达服务器。例如,保镖可能具有以下代码:

bool Bouncer::someCommand(const someCommandArg& arg) {
    if (arg.x < 100) {
        return false;                              
    }

    if (arg.y > 10) {
        return false;
    }
    // more checks ...

        return server->someCommand(arg);
}

这种方法的问题在于保镖条件必须逐个硬编码,并且不够灵活。我正在寻找一种方法来在一些配置文件中定义这些条件,保镖将在创建时加载,并将循环遍历所有 调用someCommand时的条件。而且,测试循环本身必须很快。

如果是C#,我想我会使用它的即时编译功能,并在配置文件中用普通代码编写我的if子句。你对C ++有什么建议?

2 个答案:

答案 0 :(得分:2)

选择包括:

  • 创建一个解释环境,将传入消息的可测试方面传递给它,并从您的配置中加载一些谓词表达式/函数以进行评估
    • 嵌入一种语言(例如LUA,ruby)
    • 下载任何更简单的表达式评估库
    • 创建自己的(也许使用助推精神)
  • 让保镖使用dlopen / dlsym等以共享对象(.so,。dll - 无论你的操作系统调用它们)的形式加载谓词。
    • 只需要重新编译谓词/规则
    • 不需要将整个应用程序源分发给想要指定谓词的用户
    • 非常快速的谓词执行

最好的方法很大程度上取决于有用谓词,性能要求,部署实践等的复杂性。

答案 1 :(得分:0)

您可以使用插件方法。将保镖作为插件,然后使用管道/责任链模式通过多个保镖传递命令?不同的保镖插件可以检查不同的条件,通过链接它们,您可以定义应用于该命令的最终规则。您可以使用配置文件来指定应加载哪些插件以及如何设置链。

这仍然意味着必须先编译插件才能加载它们,但是如果真的需要,你可以在程序运行时动态加载它们。至少添加新插件不需要重新编译应用程序。