首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在概念上处理跨程序的大量配置参数?

如何在概念上处理跨程序的大量配置参数?
EN

Stack Overflow用户
提问于 2015-07-10 00:57:02
回答 1查看 1.3K关注 0票数 2

假设有一个软件系统,您有大约100个参数,每个参数都是明智的改变(在我的例子中,这是一个用于机器学习的研究系统)。显而易见的解决方案是将所有参数存储在一个配置文件中,以便系统易于处理和查看。

Whis的方法更好:

  • ( a)在程序的入口点加载配置文件,并通过代码中的每个方法传递大量配置变量。
  • ( b)在程序的入口点加载配置文件,并通过代码中的每个方法传递配置变量的相关集合。
  • ( c)将配置变量直接加载到需要的位置
  • ( d)加载配置并使其成为全局配置

我愿意听取关于特定实现的建议或示例。目前,我正在试验嵌套配置变量,每个嵌套对象在代码中存储不同模块的配置。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-10 22:06:10

我建议您执行以下步骤。

首先,使用支持多节/作用域概念的配置文件语法,最好是可嵌套作用域。例如,XML元素在我所说的意义上是一个可嵌套的作用域,而".ini“文件则提供了不可嵌套的部分。Java文件不提供对作用域的直接支持,但您可以通过使用语法x.y.z来表示变量z,在作用域y中模拟这种支持,而后者又嵌套在作用域x中。* (我开发的)直接支持嵌套作用域。

其次,编写可配置Foo类的构造函数,如以下伪代码所示:

代码语言:javascript
复制
Foo(Configuration cfg, String scope) {
    _x = cfg.lookup(scope + ".x");
    _y = cfg.lookup(scope + ".y");
    _z = cfg.lookup(scope + ".z");
    _bar = new Bar(cfg, scope + ".bar");
}

在上面的伪代码中,我使用_前缀来表示实例变量,并且假设Configuration类有一个以作用域名称命名的lookup()操作,例如,cfg.lookup("foo.bar.abc")将在foo.bar作用域中返回abc变量的值。

第三,您的应用程序的main()函数可以编写如下伪代码所示:

代码语言:javascript
复制
main(...) {
    String configFileName = ...; // obtain from command-line argument
    String scope          = ...; // obtain from command-line argument
    Configuration cfg     = parseConfigurationFile(configFileName);
    Foo foo               = new Foo(cfg, scope + ".foo");
    ... // create other configured objects
    doRealWork(foo, ...);
}

最后,应用程序的命令行参数应该指定:(1)配置文件的名称,(2)包含用于运行应用程序的配置变量的顶级范围(在配置文件中)。例如,让我们假设example.cfg的结构如下:

代码语言:javascript
复制
instance1 {
    foo {
        x = "a value";
        y = "another value";
        z = "yet another value";
        bar {
           ...
        }
    }
    ... # configuration for other objects
}

instance2 {
    foo {
        x = "...";
        y = "...";
        z = "...";
        bar {
           ...
        }
    }
    ... # configuration for other objects
}

您可以以myApp.exe -cfg example.cfg -scope instance1的身份运行应用程序。

上述建议提供了以下好处:

  • 您的应用程序可以创建多个Foo对象,每个对象可以通过向每个对象的构造函数传递不同的scope参数来进行不同的配置。
  • 如果用户愿意,可以灵活地将多组配置变量存储在单个配置文件中。例如,用户可能有不同的配置变量集:(1)不同的单元测试;(2)开发、UAT和生产环境;(3)复制服务器应用程序的多个实例。
  • 随着时间的推移,您可以编写一个遵循上述设计原则的可配置类库。可配置类库可以跨多个应用程序重用。

我在我编写的几个基于C++和JavaConfig4*的应用程序中使用了上述方法,并且对我来说效果很好。如果您使用的是内置的反射支持语言(如Java),那么另一种方法是使用依赖注入框架。如果您不知道这是什么,那么在Internet上搜索“依赖注入”、“控制反转”或"Spring框架“。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31330782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档