2011-03-03 53 views
1

我有以下(简化的)体系结构:添加过滤功能上即时在C++

客户端(一个或多个) - >摇椅 - >服务器

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

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

选项包括:

  • 创建一个解释性的环境中,传入消息的可测试方面传送给它,并从你的配置加载一些谓词表达/功能进行评估
    • 嵌入语言(例如LUA,红宝石)
    • 下载任何许多简单的表达评估文库的
    • 创建你自己的(可能使用升压灵)
  • 有保镖加载谓词在共享对象的形式(的.so,.dll文件 - 无论您的操作系统调用它们)使用dlopen/dlsym进行等。
    • 只有谓词/规则需要重新编译
    • 不需要整个应用程序源分发给用户想要指定的谓词
    • 蛮快的谓词执行

什么是最好很大程度上取决于该usefu的复杂性l谓词,性能要求,部署实践等。

0

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

这仍然意味着插件必须在加载之前进行编译,但是如果这是真正的需求,则可以在程序运行时动态加载插件。至少添加新的插件不需要重新编译您的应用程序。