假设有一个软件系统,您有大约100个参数,每个参数都是明智的改变(在我的例子中,这是一个用于机器学习的研究系统)。显而易见的解决方案是将所有参数存储在一个配置文件中,以便系统易于处理和查看。
Whis的方法更好:
我愿意听取关于特定实现的建议或示例。目前,我正在试验嵌套配置变量,每个嵌套对象在代码中存储不同模块的配置。
发布于 2015-07-10 22:06:10
我建议您执行以下步骤。
首先,使用支持多节/作用域概念的配置文件语法,最好是可嵌套作用域。例如,XML元素在我所说的意义上是一个可嵌套的作用域,而".ini“文件则提供了不可嵌套的部分。Java文件不提供对作用域的直接支持,但您可以通过使用语法x.y.z来表示变量z,在作用域y中模拟这种支持,而后者又嵌套在作用域x中。* (我开发的)直接支持嵌套作用域。
其次,编写可配置Foo类的构造函数,如以下伪代码所示:
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()函数可以编写如下伪代码所示:
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的结构如下:
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参数来进行不同的配置。我在我编写的几个基于C++和JavaConfig4*的应用程序中使用了上述方法,并且对我来说效果很好。如果您使用的是内置的反射支持语言(如Java),那么另一种方法是使用依赖注入框架。如果您不知道这是什么,那么在Internet上搜索“依赖注入”、“控制反转”或"Spring框架“。
https://stackoverflow.com/questions/31330782
复制相似问题