Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在大型C++;项目 为了启动我的C++程序,我需要读一些配置,例如IP地址、端口号、文件路径…这些设置可能会经常更改(每周或每天!),因此将它们硬编码到源文件中不是一个好主意_C++ - Fatal编程技术网

在大型C++;项目 为了启动我的C++程序,我需要读一些配置,例如IP地址、端口号、文件路径…这些设置可能会经常更改(每周或每天!),因此将它们硬编码到源文件中不是一个好主意

在大型C++;项目 为了启动我的C++程序,我需要读一些配置,例如IP地址、端口号、文件路径…这些设置可能会经常更改(每周或每天!),因此将它们硬编码到源文件中不是一个好主意,c++,C++,经过一些研究,我对是否存在从文件加载配置设置并使这些配置可用于同一项目中的其他类/module/*.cpp的最佳实践感到困惑 静电不好;单身是不好的(反模式?),那么,我们还有什么其他选择呢?或者,也许“配置文件”的想法是错误的 编辑:我加载配置文件没有问题。我担心的是,在将所有这些设置加载到内存中的std::map之后,如何让其他类、函数访问这些设置 编辑2:谢谢大家的意见。我知道我在这里列出的这些模式很好,它们被很多程序使用。我很好奇是否有一种(某种)最好的模式来处理程序的配置。可以说,配置

经过一些研究,我对是否存在从文件加载配置设置并使这些配置可用于同一项目中的其他类/module/*.cpp的最佳实践感到困惑

静电不好;单身是不好的(反模式?),那么,我们还有什么其他选择呢?或者,也许“配置文件”的想法是错误的

编辑:我加载配置文件没有问题。我担心的是,在将所有这些设置加载到内存中的std::map之后,如何让其他类、函数访问这些设置


编辑2:谢谢大家的意见。我知道我在这里列出的这些模式很好,它们被很多程序使用。我很好奇是否有一种(某种)最好的模式来处理程序的配置。

可以说,配置文件是单例的合法用途。单例模式通常是不受欢迎的,因为单例在多线程环境中会导致竞争条件问题,而且由于它们是全局可访问的,所以您会遇到与全局相同的问题。但是,如果你在读取配置文件时初始化了一次你的单例对象,之后再也没有修改过,我想不出有什么正当的理由把它称为“反模式”,除了某种货物崇拜心理


也就是说,当我需要将配置文件作为对象提供给我的应用程序时,我不使用单例。通常我会将配置对象传递给那些需要它的对象/函数。

我所知道的解决这个问题的最佳模式是通过一个选项类,它在创建/配置时被注入到代码中

步骤:

  • 创建一个选项解析器类
  • 根据解析器应接受的参数和选项及其默认值(默认值可以是“最可能”的默认值)配置解析器
  • 编写客户端代码以接受选项作为参数(而不是单例和/或静态内容)
  • 创建对象时插入选项
  • 查看已成熟的程序选项模块。
    如果您熟悉python,请看一下(相同的概念,在python库中实现)。它们很容易从中获得概念和交互。

    我不明白为什么配置文件是错误的。如果您的参数需要动态更改,请将XML解析器与配置文件一起使用。否则,一个好的ol'Constants.h和define/typedef/static Constants就可以了如果你担心静态/单例的东西,你可以在文件中读一次,然后把它传递给所有需要的东西。这实际上赋予了它与单例“只有一个”这个词相同的含义,但只是没有以这种方式在代码中实现,在某些情况下,一切都是不好的。对于配置文件,单例是可以的。您的第二个解决方案是通过许多不需要的层传播配置。特别是对于他提到的数据类型,配置将在最底层使用。在这种情况下,单例是目前为止最好的解决方案。@JamesKanze是对的。如果我传递配置对象,它必须经过许多层。@CharlesSalvia-“我想不出一个合理的理由将其称为“反模式”[…]”一个单身汉给我提出的问题是重构/测试。虽然您可以更改设置文件中的值,但singleton允许您编写不带依赖项注入的客户机代码,但可以通过内部访问get实例。这会导致一种深层的、不明显的依赖关系,这种依赖关系往往会蔓延到整个代码库,以后很难替换。如果你的设置类不是一个单一类,你就保留了所有的优势,除了隐藏的非集中式依赖性问题。如果配置最终会修改这些层的行为,我认为通过许多层传递配置没有问题。它们委托给子层的事实是一个实现细节,从调用方的角度来看,层使用配置。