добавление функциональности фильтрации на лету в C ++ - PullRequest
1 голос
/ 03 марта 2011

У меня есть следующая (упрощенная) архитектура:

клиент (ы) -> баунсер -> сервер

Клиенты отправляют команды на сервер. «Вышибала» выполняет проверку работоспособности и другие проверки команд, выданных клиентом, и предотвращает попадание ошибочных команд на сервер. Например, вышибала может иметь следующий код:

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 ]

2 голосов
/ 03 марта 2011

Выбор включает в себя:

  • создать интерпретирующую среду, передать тестируемые аспекты входящего сообщения и загрузить некоторые предикатные выражения / функции из вашей конфигурации для оценки
    • встроить язык (например, LUA, ruby)
    • скачать любую из множества более простых библиотек оценки выражений
    • Создайте свой собственный (возможно, используя Boost Spirit)
  • пусть bouncer загружает предикаты в форме общего объекта (.so, .dll - как бы их ни назвала ваша ОС), используя dlopen / dlsym и т. Д.
    • необходимо перекомпилировать только предикаты / правила
    • не нужно распространять весь исходный код приложения пользователям, желающим указать предикаты
    • довольно быстрое выполнение предиката

Что лучше всего зависит от сложности полезных предикатов, требований к производительности, практики развертывания и т. Д.

0 голосов
/ 03 марта 2011

Вы можете использовать плагин. Сделать баунсер плагином, а затем использовать шаблон конвейера / цепочки ответственности для передачи команды через несколько баунсеров? Различные плагины баунсеров могут проверять различные условия, и, связывая их, вы определяете последнее правило, применяемое к команде. Вы можете использовать файл конфигурации, чтобы указать, какие плагины должны быть загружены и как настроить цепочку.

Это по-прежнему означает, что плагины должны быть скомпилированы до того, как вы сможете их загрузить, но вы можете динамически загружать их во время работы вашей программы, если это действительно требуется. По крайней мере, добавление новых плагинов не требует перекомпиляции вашего приложения.

...