为什么这么多程序使用“foo.bar.baz = qux”样式的配置?

为什么这么多程序使用“foo.bar.baz = qux”样式的配置?

我注意到很多程序将配置信息存储在各种层级键中。例如,Firefox有和和about:config这样的键。我注意到 Firefox、OS X ( )、等都存在这种配置样式。为什么它如此常见?是不是有些早期程序使用了它,所以其他人就抄袭了它?network.http.pipeliningnetwork.http.pipelining.sslnetwork.http.use-cacheLibrary/Preferencessysctl

答案1

这种层次约定是为了提供清晰度,帮助我们了解每个设置的影响范围,并区分各个模块中具有相同或模糊名称的多个设置。

这对于具有太多可能设置而无法包含在主用户中的应用程序非常有用选项页面(其中层次结构通过标签或页面显示),是纯文本的一个很好的替代品INI 文件(带有[title]节分隔符)更容易出现用户错误,并且通常需要重新启动应用程序才能生效。

等级制度设置也可能在一定程度上反映出内部自上而下的面向对象模型开发人员使用:

层次结构图像

在这个示例模型中,我们可以很好地想象其中有一个 person.professor.disallow_strikes = true 设置,而 students.disallow_strikes 可以保持为 false 或根本不可用。这种划分也是命名空间在编程语言中(并且流行的.NET 框架遵循完全相同的命名约定:)using System.Threading.Tasks

因此,我们现在可以假设network.http.xxx设置不应该对network.ftp其他网络子模块产生影响,而network.xxx设置可能会对所有网络子模块产生影响。

额外的信息是有益的......

  • 对于用户:我们更好地了解应用程序的哪个部分给定的设置会产生影响,从而更容易排除故障(并避免!)

  • 对于开发人员来说:从事或排除特定模块故障的人员可以轻松了解哪些用户可修改的设置会影响他/她当前的工作并专注于此。

答案2

您在开篇中提到了主要原因之一:分层密钥。

每组键都是分组的。所有与网络相关的键都是 network.something。所有与 http 相关的键都是 network.http.something 等等。这使得键本身在某种程度上可以自我记录值所指的内容。如果使用 ini 文件样式(要清楚,如果您愿意,没有什么可以阻止您使用这类键)与 [section] 和 key=value 对,则给定的键可能会不明确,直到知道该部分为止。此外,键在文件中的位置很重要。将 ssl 键放在 [GUI] 部分可能是一个错误,可能会导致键被忽略。abc 样式应该意味着文件中键的顺序无关紧要。如果您读到 networking.http.ssl.key=,那么前一行是 gui.background.color= 还是其他内容都无关紧要。完全合格的键是命名的。

它为什么如此常见?因为它非常有用。它还易于人类阅读和理解(逐个按键)以及编辑。

它从何而来?我会说 C 风格的结构,它可能有我不知道的血统,并且已经渗透到许多其他编程语言中。在 C 结构中设置一个值将是 structure.property=value,对于嵌套结构将是 structure.substructure.property=value 等等(虽然在现实生活中,指针会将许多这些点转换为 ->,但这是一件小事)。

相关内容