参数设置的设计模式,可在适当大小的java项目中维护

时间:2012-09-27 06:59:49

标签: java maintainability

我正在寻找有关如何为我的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 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:3)

也许不是你问题的完整答案,但有些要点需要考虑:

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

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

Avoid creating a Singleton如果可能,设置管理器,单例会损害可测试性并以各种方式破坏应用程序的设计。

答案 3 :(得分:1)

如果参数数量很大,我会将它们分成几个配置文件。 @Pino提到的Apache Commons Configuration实际上是一个很好的库来处理它们。 在Java端,我可能会为每个文件创建一个配置类,并将Commons Configuration配置包装到加载设置,例如:

class StatisticsConfig {

   private Configuration config = ... ;

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

如果参数数量很大,这可能需要相当多的样板代码,但我认为它是非常干净的解决方案(并且易于重构)。