表示参数/配置/设置

时间:2009-05-04 18:16:27

标签: oop

好吧,假设我正在使用面向对象语言编写应用程序,并且我有一组代表程序参数/配置/选项/设置等的键值对。这些可能是某些变量的初始值,或者只是在会话之间不受约束的值。我应该如何在我的数据模型中表示这些值?

我最初的想法是简单地将所有值存储在全局可访问的单个类中(可能是单例),因为这些值将在代码中的各个位置使用。但是,这将使所有其他类依赖于此单例。

在这种情况下这是一个问题吗?还有其他理想的解决方案,我没有想过吗?你们如何通常代表这类数据?关于这个问题我还有什么需要注意的吗?

由于

3 个答案:

答案 0 :(得分:1)

您可能希望使用依赖注入。创建一个接口IConfigurationProvider。创建一个实现该接口并执行实际任务的类DefaultConfigurationProvider。使依赖于配置数据的其他对象期望IConfigurationProvider实例,并为它们提供DefaultConfigurationProvider的实例。大多数依赖注入框架都会为您处理这个问题。

答案 1 :(得分:1)

“这是一个问题[使用Singleton配置]吗?

不是。

“所有其他类依赖于此单例”

不是真的。您可以轻松地设计一些东西,以便某些类得到配置,并将其提供给其他类。

这是一个可重新定位的问题 - 哪个类/包/方法对此配置问题负责。答案应该是非常非常少的类需要知道配置。

例如,您的模型可能应该专注于问题域而不依赖于实现的细微差别。它可能不需要任何配置。

“还有其他理想的解决方案,我没有想过吗?”

不是真的。配置问题很难。您可能具有默认配置,覆盖默认配置,命令行选项。这很复杂。

“人们通常如何代表此类数据?”

大部分都是单身人士。通常,给定应用程序中的一些关键“顶级”类必须知道配置并使用该信息来配置所有其他类。

对于命令行程序,由“main”程序调用以解析参数的类也将知道配置。就是这样。

对于Web应用程序,Web应用程序的顶级部分使用该配置来构建,配置,自定义或实例化其他内容。在许多情况下,密钥工厂将使用配置来决定要创建的内容。密钥构建器可能需要配置来自定义其构建的复合对象。

配置不是“全局”。所有班级都看不到。它就像数据库一样,是一种宝贵的资源,它由负责处理配置的类精心包装。

“关于这个问题我还有什么需要注意的吗?”

是。 Singleton的配置不是全局的。它是一种稀缺,珍贵的资源,用于几个关键的地方。越少越好。

答案 2 :(得分:0)

这取决于你的具体情况。

例如,您可以使用方法getParameter(String name)和提供类Context setParameter(String name,Object value)以及保存配置参数所需的许多其他方法。

您可以将Context作为参数传递给应该使用config的类的构造函数。参数:

public class ConfigUser {
   private Context c;
   public ConfigUser (Context c) {
      this.c = c;
   }
   ...
}