Должны ли мы перегрузить смысл настроек конфигурации? - PullRequest
0 голосов
/ 08 декабря 2011

Представьте себе пример некоторого поиска параметров конфигурации, называемого «конфигурация», используемого следующим образом:

if(! string.IsNullOrEmpty(configuration["MySetting"])
{
    DoSomethingWithTheValue(configuration["MySetting"]);
}

Значение настройки перегружено. Это означает «включить или выключить эту функцию» и «здесь есть конкретное значение, с которым нужно что-то делать». Их можно разложить на две настройки:

if(configuration["UseMySetting"])
{
    DoSomethingWithTheValue(configuration["MySetting"]);
}

Второй подход, кажется, усложняет конфигурирование, но его немного легче анализировать, и он разделяет два вида поведения. Первый кажется намного проще на первый взгляд, но не ясно, что мы выбрали в качестве настройки по умолчанию «отключить это». "" может на самом деле допустимое значение для MySetting.

Существует ли общее правило наилучшей практики для этого?

1 Ответ

0 голосов
/ 10 декабря 2011

Я нахожу вопрос немного запутанным, потому что он говорит о (1) разборе и (2) с использованием настроек конфигурации, но примеры кода предназначены только для последних , Эта путаница означает, что мой ответ может не иметь отношения к тому, что вы намеревались спросить. Во всяком случае ...

Я предлагаю подход, который иллюстрируется следующим API псевдокода (комментарии следуют позже):

class Configuration
{
    void parse(String fileName);
    boolean exists(String name);
    String  lookupString(String name);
    String  lookupString(String name, String defaultValue);
    int     lookupInt(String name);
    int     lookupInt(String name, int defaultValue);
    float   lookupFloat(String name);
    float   lookupFloat(String name, float defaultValue);
    boolean lookupBoolean(String name);
    boolean lookupBoolean(String name, boolean defaultValue);
    ... // more pairs of lookup<Type>() operations for other types
}

Операция parse() анализирует файл конфигурации и сохраняет проанализированные данные в удобном формате, например, в карте или хэш-таблице. (Если вы хотите, parse() может делегировать разбор сторонней библиотеке, например, анализатору XML, свойств Java, JSON, .ini и т. Д.)

После завершения анализа ваше приложение может вызывать другие операции для извлечения / использования настроек конфигурации.

Операция lookup<Type>() извлекает значение указанного имени и анализирует его в указанном типе (и выдает исключение в случае сбоя синтаксического анализа). Для каждой операции lookup<Type>() есть две перегрузки. Версия с одним параметром выдает исключение, если указанная переменная не существует. Версия с дополнительным параметром (обозначающим значение по умолчанию) возвращает это значение по умолчанию, если указанная переменная не существует.

Операция exists() может использоваться для проверки того, существует ли указанное имя в файле конфигурации.

Приведенный выше API псевдокода предлагает два преимущества. Во-первых, он обеспечивает безопасный тип доступа к данным конфигурации (что не было заявленным требованием в вашем вопросе, но я думаю, что это важно в любом случае). Во-вторых, он позволяет различать «переменная не определена в конфигурации» и «переменная определена, но ее значение является пустой строкой».

Если вы уже посвятили себя определенному синтаксису конфигурации, то просто реализуйте вышеуказанный класс Configuration в качестве тонкой оболочки для синтаксического анализатора для существующего синтаксиса конфигурации. Если вы еще не выбрали синтаксис конфигурации и если ваш проект находится на C ++ или Java, вы можете обратиться к моей библиотеке Config4 *, которая предоставляет готовую к использованию реализацию вышеупомянутого класс псевдокода (с несколькими дополнительными прибамбасами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...