想象一下一些名为“configuration”的配置设置查找实例,如下所示:
if(! string.IsNullOrEmpty(configuration["MySetting"])
{
DoSomethingWithTheValue(configuration["MySetting"]);
}
设置的含义过载。这意味着“打开或关闭此功能”和“这是一个特定值来做某事”。这些可以分解为两个设置:
if(configuration["UseMySetting"])
{
DoSomethingWithTheValue(configuration["MySetting"]);
}
第二种方法似乎使配置更复杂,但稍微更容易解析,并且它将两种行为分开。第一个似乎开始时简单得多,但我们选择默认的“关闭此设置”并不清楚。 “”实际上可能是MySetting的有效值。
这是否有一般的最佳实践规则?
答案 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*库,它提供了上述伪代码的即用型实现。上课(有一些额外的铃声和口哨声)。