不要使用环境变量进行配置

2021-04-01 20:08:55

假设您需要创建一个函数,以便在普通C中加上两个数字。您如何写入它?它会有什么样的API?一个可能的实施方式是这样的:

这是,我相信你们都同意,可怕。这种方法是易错误的,针对所有接受的编码实践,并在任何代码审查中立即被拒绝。它作为读者举行的练习来提出这种架构被破坏的方式。您甚至需要调查线程安全以查找正确的错误。

环境变量正是如此:可变的全局状态。 Evenvars有一些合法的用法(例如启用调试日志记录),但它们永远不会用于配置程序的核心功能。可悲的是,他们用于这个目的很多,有些人认为这是一件好事。由于奇怪的角落,边缘甚至常见情况,这不会导致头痛的结束。

例如,假设您运行具有某种持久状态的命令行程序。

环境现在不同。程序应该做些什么?使用具有env var set的旧配置或未设置的新配置?出错?尝试默默地将不同的选项合并到一个?别的东西?

答案是你,最终用户现在不能。每个程序都可以自由地完成自己的东西,并且最多。如果您曾经过时过,请想知道为什么从一个终端运行但不是另一个终端时的完全相同的命令,这可能是为什么。

环境变量只能包含单个空终止字节流。这是非常有限的。至少在你和#39; d想要有数组,但不支持它。当然,这不是一个问题,你说,你可以随时做出带信令。例如,路径环境变量具有许多由以下方式分隔的目录。什么可能更简单?事实证明,很多事情。

首先是路径的分隔符并不总是:。在Windows上它是;。更一般地,每个程序都可以自由选择自己。一个常见的选择是空间:

除了你需要将空格字符作为参数的一部分传递什么?根据实际程序,shell和月亮的阶段,您可能需要这样做:

没有办法知道其中哪一个是正确的形式。你必须尝试一切,看看哪一个有效。有时,作为实现详细信息,字符串会多次扩展,以便引用报价字符。在这里插入您喜欢的Xzibit的图片。

有关使用JSON配置文件进行比较,则不存在整个类操作系统问题。每个应用程序都会以相同的方式读取数据,因为JSON提供了基元以表达这些更高级别的构造。相比之下,每次环境变量需要携带更多信息而不是单个没有一个没有一个没有一个没有一个没有一个没有一个没有的字符串时,程序员都会创建一个新的ad hoc数据编组方案,如果有的话可以保证可用性它的一件事' s重新打造正方形车轮。

对此有一秒钟,更加透念。如果通过环境变量进行决定,则整个设计目标会发生变化。而不是提出与给定的问题尽可能好的语法,而不是目标是产生易于在终端的命令时易于使用的语法。这减少了即时短期内的工作,但在中期长期增加了它。

第一个解释了为什么甚至新程序通过envvars添加配置选项(无需将代码添加到命令行解析器,所以'净赢得右键?)。第二种使得似乎是嫉妒是一种正常和合理的事情,因为它们如此普遍。

第三个使得这一切都是不可能改善更大规模的东西。现在,授予,修复这些问题将是很多工作,过渡将无法解除很多错误,但最终结果将更加可读和可靠。