Jan*_*nar 67 command-line process environment-variables argument-passing spawn
我们开发人员编写的大多数应用程序都需要在启动时进行外部参数化.我们传递文件路径,管道名称,TCP/IP地址等.到目前为止,我一直在使用命令行将这些传递给正在启动的应用程序.我不得不解析命令行main并将参数指向他们需要的地方,这当然是一个很好的设计,但很难维护大量的参数.最近我决定使用环境变量机制.它们是全局的,可以从任何地方访问,从架构的角度来看不太优雅,但限制了代码量.
这些是我对这两种策略的第一次(也可能是很浅的)印象,但我想听听更多有经验的开发人员的意见 - 使用环境变量和命令行参数将参数传递给进程的起伏是什么?我想考虑以下事项:
备注:
广告.这是我感兴趣的主要方面.
广告.这有点务实.据我所知,这是目前在Windows上一定的局限性巨大(超过32kB的两个命令行和环境块).我想这不是问题,因为如果需要,你应该使用一个文件来传递大量的参数.
广告.我几乎不知道Unix,所以我不确定这两种策略是否像在Windows上一样可用.如果你愿意,请详细说明.
Mat*_*ick 70
1)我建议尽可能避免环境变量.
环境变量的优点
环境变量的缺点
我的看法
They are global and accessible from anywhere, which is less elegant from architectural point of view, but limits the amount of code让我想起了使用全局变量的理由;)我的伤疤来自第一手环境变量过度使用的恐怖
2)限制
如果我正在推动命令行可以容纳的限制,或者环境可以处理什么,我会立即重构.
我过去曾使用JSON作为需要大量参数的命令行应用程序.能够使用字典和列表以及字符串和数字非常方便.该应用程序只使用了几个命令行参数,其中一个是JSON文件的位置.
这种方法的优点
What won't fit into command line parameters?),如列表注意:我想区别于.config文件方法 - 这不是用于存储用户配置.也许我应该将其称为'命令行参数文件'方法,因为我将它用于需要许多不适合命令行的值的程序.
3)解决方案的可移植性:我不太了解Mac,PC和Linux在环境变量和命令行参数方面的差异,但我可以告诉你:
是的,我知道 - 这不是很有帮助.对不起.但关键的一点是,你可以期待一个合理的解决方案是可移植的,虽然你肯定想要为你的程序验证这一点(例如,命令行args在任何平台上是否区分大小?在所有平台上?我不知道).
最后一点:
正如Tomasz所提到的,对于参数来自的大多数应用程序来说,它都无关紧要.
我认为这个问题已经得到了很好的回答,但我觉得它值得 2018 年更新。我觉得环境变量的一个未提及的好处是它们通常需要更少的样板代码来使用。这使得代码更清晰、更易读。然而,一个主要缺点是它们消除了同一台计算机上运行的不同应用程序之间的隔离层。我认为这就是 Docker 真正闪光的地方。我最喜欢的设计模式是专门使用环境变量并在 Docker 容器内运行应用程序。这消除了隔离问题。
您应该使用策略模式抽象读取参数.使用以下实现创建一个名为ConfigurationSourcehaving readConfig(key) -> valuemethod(或返回一些Configuration对象/结构)的抽象:
CommandLineConfigurationSourceEnvironmentVariableConfigurationSourceWindowsFileConfigurationSource - 从配置文件加载 C:/Document and settings...WindowsRegistryConfigurationSourceNetworkConfigrationSourceUnixFileConfigurationSource - 从配置文件加载 /home/user/...DefaultConfigurationSource - 默认值您还可以使用Chain of responsibility模式在各种配置中链接源,例如:如果未提供命令行参数,请尝试环境变量,如果其他所有操作都失败,则返回默认值.
广告1.此方法不仅允许您抽象阅读配置,而且您可以轻松更改基础机制,而不会对客户端代码产生任何影响.此外,您可以同时使用多个源,后退或从不同来源收集配置.
广告2.只需选择适合的实施方式.当然,一些配置条目不适合例如命令行参数.
广告3.如果某些实现不可移植,则在不适合给定系统时,有两个,一个默默地忽略/跳过.
| 归档时间: |
|
| 查看次数: |
13144 次 |
| 最近记录: |