2011-03-03 61 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

您可以使用插件方法。讓保鏢成爲一個插件,然後使用管道/責任鏈模式通過多個保鏢傳遞命令?不同的保鏢插件可以檢查不同的條件並鏈接它們,您可以定義應用於該命令的最終規則。您可以使用配置文件來指定應該加載哪些插件以及如何設置鏈。

這仍然意味着插件必須在加載之前進行編譯,但是如果這是真正的需求,則可以在程序運行時動態加載插件。至少添加新的插件不需要重新編譯您的應用程序。