我们应该重载配置设置的含义吗?

时间:2011-12-07 21:15:11

标签: configuration

想象一下一些名为“configuration”的配置设置查找实例,如下所示:

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

设置的含义过载。这意味着“打开或关闭此功能”和“这是一个特定值来做某事”。这些可以分解为两个设置:

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

第二种方法似乎使配置更复杂,但稍微更容易解析,并且它将两种行为分开。第一个似乎开始时简单得多,但我们选择默认的“关闭此设置”并不清楚。 “”实际上可能是MySetting的有效值。

这是否有一般的最佳实践规则?

1 个答案:

答案 0 :(得分:0)

我发现这个问题有些令人困惑,因为它讨论了(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*库,它提供了上述伪代码的即用型实现。上课(有一些额外的铃声和口哨声)。