4

我正在寻找有关如何为我的 java 程序管理许多不同参数设置的具体想法。我知道这个问题有点分散,但我需要一些关于大局的想法,以便我的代码变得更易于维护。

我的项目所做的是对数据执行许多处理步骤,主要是文本。这些处理步骤是具有不同复杂性的算法,通常具有许多设置。我还想更改配置文件使用的处理步骤。

我的程序的原因是进行可重复的实验,因此我需要能够完整地查看代码不同部分中使用的所有参数,最好是采用良好的格式。

在这个(原型)阶段,我在源代码中有如下设置:

public static final param1=0.35;

并且负责某些处理步骤的每个类都有自己的硬编码设置。这实际上是相当可怕的,因为没有简单的方法来改变事物,甚至无法查看做了什么以及使用了哪些参数/设置。

我的想法是为所有设置提供一个中央键/值存储,它也支持所有设置的转储。例子:

k:"classA_parameter1",v:"0.35"
k:"classC_parameter5",v:"false"

但是,我真的不想将参数存储为字符串,而是将它们与实际的 java 类或对象相关联。

拥有一个管理一切的单例“SettingsManager”是否更聪明。或者在 main 可以访问的每个类中都有一个 SettingsManager 对象?我不太喜欢存储设置的字符串描述,但我看不到任何其他方式(假设一个设置是使用的 SAXparser 实现,另一个参数是双精度,例如百分比),因为我真的不想存储它们作为对象并投射它们。

非常感谢有关相关设计模式的经验和页面链接。

为了澄清,我的实验可以被视为一系列处理来自文件/数据库的数据的算法。这些算法根据它们在整个过程中的任务分为不同的类,例如

Experiment //main
   InternetLookup //class that controls e.g. web scraping
      ThreadedWebScraper 
      LanguageDetection //from "text analysis" package
   Statistics    //Calculate and store statistics
      DatabaseAccess
   DecisionMaking //using the data that we have processed earlier, make decisions (machine learning)
      BuildModel
      Evaluate

每个最低级别的类都有参数并且是不同的,但我仍然想要了解正在发生的一切。

4

4 回答 4

8

您有以下选项,从最简单的选项开始:

  1. 属性文件_
  2. Apache Commons 配置
  3. 春天框架

后者允许从 XML 配置文件创建任何 Java 对象,但请注意,它是一个框架,而不是库:这意味着它会影响整个应用程序的设计(它促进了控制反转模式)。

于 2012-09-27T07:09:07.987 回答
3

这个轮子已经被发明了多次。

从最基本的 java.util.Properties 到更高级的框架,如 Spring,它提供了值注入和类型转换等高级功能。

自己构建可能是最糟糕的方法。

于 2012-09-27T07:13:18.440 回答
3

也许不是您问题的完整答案,但需要考虑以下几点:

将值存储为字符串(并通过 SettingsManager 将字符串解析为其他类型)是常用的方法。如果您的配置值太复杂而无法执行此操作,那么它可能不是真正的配置值,而是您实现的一部分。

考虑通过构造函数参数注入每个类所需的单独配置值,而不是仅仅传入整个 SettingsManager 对象(参见Demeter 法则

尽可能避免创建单例设置管理器,单例会损害可测试性并以各种方式破坏应用程序的设计。

于 2012-09-27T07:15:07.597 回答
1

If the number of parameters is big I would split them to several config files. Apache Commons Configuration, as mentioned by @Pino is really a nice library to handle them. On the Java-side I would probably create one config-class per file and wrap Commons Configuration config to load settings, eg:

class StatisticsConfig {

   private Configuration config = ... ;

   public double getParameter1() {
        return config.getDouble("classA_parameter1");
   }
}

This may need quite a lot of boilerplate code if the number of parameters is big but I think it is quite clean solution (and easy to refactor).

于 2012-09-27T07:22:12.823 回答