1)我建议尽可能避免环境变量。
环境变量的优点
- 易于使用,因为它们在任何地方都可见。如果许多独立程序需要一条信息,则此方法要方便得多。
环境变量的缺点
- 很难正确使用,因为它们在任何地方都是可见的(可删除,可设置)。如果我安装了一个依赖于环境变量的新程序,它们是否会脚我现有的变量?昨天四处逛逛时,我是否无意间弄乱了我的环境变量?
我的意见
- 将命令行参数用于那些对于程序的每个单独调用而言最有可能不同的参数(即,对于计算n!的程序而言,n)。
- 将配置文件用于用户可能需要更改但不经常更改的参数(即,弹出窗口时的显示大小)
- 谨慎地使用环境变量-最好仅用于预期不会改变的参数(即Python解释器的位置)
- 您的观点使
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文件的位置。
这种方法的优点
- 无需编写大量(痛苦的)代码即可与CLI库进行交互-要使许多通用库强制执行复杂的约束可能会很痛苦(“复杂”是指比检查a更为复杂)特定键或一组键之间的交替)
- 不必担心CLI库对参数顺序的要求-只需使用JSON对象即可!
- 易于表示复杂数据(
What won't fit into command line parameters?
如清单)
- 易于使用其他应用程序中的数据-以编程方式创建和解析
- 易于容纳将来的扩展
注意:我想将此与.config-file方法区分开-这不是用于存储用户配置。也许我应该将其称为“命令行参数文件”方法,因为我将其用于需要大量在命令行上不太适合的值的程序。
3)解决方案的可移植性:我对Mac,PC和Linux之间在环境变量和命令行参数方面的差异了解不多,但是我可以告诉您:
是的,我知道-这不是很有帮助。对不起。但是关键是您可以期望一个合理的解决方案是可移植的,尽管您肯定会想对您的程序进行验证(例如,命令行参数在任何平台上是否区分大小写?在所有平台上?我不知道)。
最后一点:
正如Tomasz所提到的,对于大多数应用程序来说,参数的来源并不重要。