Language agnostic 带命令行参数的自配置类:模式还是反模式?

Language agnostic 带命令行参数的自配置类:模式还是反模式?,language-agnostic,configuration,Language Agnostic,Configuration,我有一个程序,其中很多类都有非常复杂的配置要求。我采用了分散配置的模式,允许每个类在其c'tor中获取和解析命令行/配置文件参数,并对其执行任何需要的操作。(这些是非常粗粒度的类,只实例化了几次,因此这里绝对没有性能问题。)这避免了必须进行散弹枪操作来检查我添加的所有需要通过的级别的新选项。它还避免了在多个位置(解析和使用位置)指定每个配置选项 这种编程方式有哪些优点/缺点?它似乎减少了关注点的分离,因为每个类现在都在做配置工作,并且使程序更少地自我记录,因为类所采用的参数变得不那么明确。另外,

我有一个程序,其中很多类都有非常复杂的配置要求。我采用了分散配置的模式,允许每个类在其c'tor中获取和解析命令行/配置文件参数,并对其执行任何需要的操作。(这些是非常粗粒度的类,只实例化了几次,因此这里绝对没有性能问题。)这避免了必须进行散弹枪操作来检查我添加的所有需要通过的级别的新选项。它还避免了在多个位置(解析和使用位置)指定每个配置选项


这种编程方式有哪些优点/缺点?它似乎减少了关注点的分离,因为每个类现在都在做配置工作,并且使程序更少地自我记录,因为类所采用的参数变得不那么明确。另外,它似乎增加了封装,因为它使每个类都更加独立,因为程序的其他部分不需要确切地知道一个类可能需要什么配置参数。

无论您采用何种方式,您都有几个“模块”竞争相同的命令行参数序列。必须有一些合作,这样类才能处理相同的命令行参数,而不会产生冲突

通过让每个类实现解析,您只需隐式地进行协作。没有专门用于课程间合作的模块。问题变成了文档问题,而不是代码问题。这并不坏,但它可能看起来很诱人,好像问题已经“消失”了。简而言之,这种做法需要更多的纪律

此外,它还将使命令行参数语法的大修变得更加困难

它似乎在增加 封装,使每个 类更加独立,因为没有 计划的其他部分需要 确切地知道什么配置 类可能需要的参数

如果我理解你的建议,它确实让每个类隐藏了它们的依赖关系


这种情况下的依赖关系可能很简单(基本),但如果类需要用户名和密码才能正常工作,则应该在其构造函数中这样说。否则,类的调用者需要查看源代码或文档才能使用它。

总的来说,这是好的方面,但所有类都使用相同的getopt库,这不会改变。这是一个思想流派。我想,在某种程度上,这可以追溯到古老的明确性与封装性的争论。有时两者之间会有一个权衡。我倾向于封装。有些人喜欢明确。我想这是一个在没有设置的情况下,类是否可以完成其工作的问题。您不能封装依赖项-如果未提供依赖项,则类会抛出异常或悄悄失败,这与封装相反。另一种说法是,如果必须提供它们,它们不会被封装。(通过配置文件或命令行参数)是的,在某些情况下会抛出异常,但它们并不意味着被捕获。它们只是显示一条错误消息并终止程序。此外,很多(但不是全部)选项只是带有合理默认值的可选标志。在这种情况下,不会抛出异常。也许我误解了你在做什么。从这个问题上看,您的建议类似于用一个新的构造函数替换.NET的
DateTime
构造函数(随机举个例子):
DateTime(params object[]args)
。这不公平吗?我不使用.NET,我使用的是D,但它更像
string[]args
。所讨论的参数基本上是整数、字符串和标志。没有比这更复杂的了。