我们开发人员编写的大多数应用程序都需要在启动时进行外部参数化。我们传递文件路径、管道名称、TCP/IP 地址等。到目前为止,我一直在使用 命令行 将这些传递给正在启动的应用程序。我必须解析 main
中的命令行并将参数指向需要它们的地方,这当然是一个很好的设计,但是对于大量参数来说很难维护。最近我决定使用 环境变量 机制。它们是全局的,可以从任何地方访问,从架构的角度来看不太优雅,但限制了代码量。
这些是我对这两种策略的第一印象(可能很肤浅),但我想听听更有经验的开发人员的意见 -- 使用环境变量和命令行参数将参数传递给进程的优缺点是什么? 我想考虑以下事项:
备注:
广告。 1. 这是我感兴趣的主要方面。
广告。 2.这有点务实。我知道 Windows 上的一些限制目前是 huge (命令行和环境块都超过 32kB)。我想这不是问题,因为如果需要,您只应该使用一个文件来传递大量参数。
广告。 3. 我对 Unix 几乎一无所知,所以我不确定这两种策略是否与在 Windows 上一样可用。如果您愿意,请详细说明这一点。
最佳答案
1)我建议尽可能避免环境变量。
环境变量的优点
环境变量的缺点
我的意见
They are global and accessible from anywhere, which is less elegant from architectural point of view, but limits the amount of code
让我想起了使用全局变量的理由;) 我因亲 body 验环境变量过度使用的恐怖而留下的疤痕
2) 限制
如果我要突破命令行可以容纳的内容或环境可以处理的内容的限制,我会立即进行重构。
我过去曾将 JSON 用于需要大量参数的命令行应用程序。能够使用字典和列表以及字符串和数字非常方便。该应用程序只需要几个命令行参数,其中一个是 JSON 文件的位置。
这种方法的优点
What won't fit into command line parameters?
),例如列表 备注 :我想将此与 .config-file 方法区分开来——这不是用于存储用户配置。也许我应该称其为“命令行参数文件”方法,因为我将它用于需要大量不适合命令行的值的程序。
3) 解决方案的可移植性:我不太了解 Mac、PC 和 Linux 在环境变量和命令行参数方面的区别,但我可以告诉你:
是的,我知道——这不是很有帮助。对不起。但关键是你可以 期望一个合理的解决方案是可移植的,尽管您肯定希望为您的程序验证这一点(例如,命令行参数是否在任何平台上区分大小写?在所有平台上?我不知道)。
最后一点:
正如 Tomasz 所提到的,对于参数来自的大多数应用程序来说应该无关紧要。
关于command-line - 参数传递策略 - 环境变量与命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7443366/