我有一种将配置文件解析为字典的方法。如果缺少配置参数,我不确定它应该如何表现。它应该使用默认值并记录错误或引发异常吗?
1 回答
我建议您将:(1)配置文件的解析并将解析的详细信息存储到字典中,与(2)从字典中检索名称=值对。然后,这种关注点分离将使您能够为 (2) 提供重载 API,该 API 指定缺少的name=value对是否应导致返回默认值或引发异常。例如(伪代码):
cfg = parseConfigurationFile("example.cfg")
x = cfg.lookupString("x"); // throws an exception if the name=value is missing
y = cfg.lookupString("y", "hello, World!"); // returns default value if name=value is missing
我还建议 API 应该提供类型安全的查找方法,例如lookupInt()
,lookupBoolean()
等lookupDouble()
。如果无法将查找的值解析为指定类型,则这些方法应引发异常。
编辑以回复评论
“谢谢你的例子。我想知道如果配置错误,甚至提供默认设置并启动应用程序是否是个好主意。”
我喜欢Fail Fast Principle,所以我建议如果任何配置数据无效,您的应用程序应该报告错误并停止,而不是尝试静默修复错误(可能通过使用默认值而不是错误的配置值)和继续。
但是,我认为您不必将缺少的 name=value 对视为错误。相反,对缺失值使用默认值是有效的。如果您通过允许所有配置 name=value 对是可选的来将这一点发挥到极致,那么您的应用程序将能够“开箱即用”工作而无需任何配置文件,这可以说提高了应用程序的易用性新用户。
几年前,我编写了Config4*(用于解析特定配置文件语法的 C++ 和 Java 库)。Config4* 提供了一种优雅的方式来启用任何/所有名称=值对是可选的:这就是 Config4* 手册所称的回退配置。如果您想了解这方面的知识,那么我建议您略读Config4* 入门指南的第 2 章以了解配置语法,然后阅读同一手册的第 3 章以了解 API。请特别注意第 3.6.2 节(解析嵌入式配置)和第 3.6.3 节(使用备用配置)。