保留Java应用程序设置的一种简单方法是使用扩展名为“ .properties”的文本文件表示,该文件包含与特定值(此值可以是数字,字符串,日期等)关联的每个设置的标识符。 。C#使用类似的方法,但文本文件必须命名为“ App.config”。在这两种情况下,都必须在源代码中初始化一个特定的类来读取设置:此类具有一种方法,该方法返回与指定的设置标识符关联的值(作为字符串)。
// Java example
Properties config = new Properties();
config.load(...);
String valueStr = config.getProperty("listening-port");
// ...
// C# example
NameValueCollection setting = ConfigurationManager.AppSettings;
string valueStr = setting["listening-port"];
// ...
在这两种情况下,我们都应该解析从配置文件加载的字符串,并将转换后的值分配给相关的类型化对象(在此阶段可能发生解析错误)。解析步骤之后,我们必须检查设置值是否属于特定的有效域:例如,队列的最大大小应为正值,某些值可能是相关的(例如:min <max ), 等等。
假设应用程序应在启动时立即加载设置:换句话说,应用程序执行的第一个操作是加载设置。设置的任何无效值必须自动替换为默认值:如果一组相关设置发生这种情况,则这些设置都将设置为默认值。
执行这些操作的最简单方法是创建一个方法,该方法首先解析所有设置,然后检查加载的值,最后设置任何默认值。但是,如果使用这种方法,维护将很困难:随着开发应用程序时设置数量的增加,更新代码变得越来越困难。
为了解决此问题,我想到了如下使用“ 模板方法”模式。
public abstract class Setting
{
protected abstract bool TryParseValues();
protected abstract bool CheckValues();
public abstract void SetDefaultValues();
/// <summary>
/// Template Method
/// </summary>
public bool TrySetValuesOrDefault()
{
if (!TryParseValues() || !CheckValues())
{
// parsing error or domain error
SetDefaultValues();
return false;
}
return true;
}
}
public class RangeSetting : Setting
{
private string minStr, maxStr;
private byte min, max;
public RangeSetting(string minStr, maxStr)
{
this.minStr = minStr;
this.maxStr = maxStr;
}
protected override bool TryParseValues()
{
return (byte.TryParse(minStr, out min)
&& byte.TryParse(maxStr, out max));
}
protected override bool CheckValues()
{
return (0 < min && min < max);
}
public override void SetDefaultValues()
{
min = 5;
max = 10;
}
}
问题在于,通过这种方式,我们需要为每个设置(甚至是单个值)创建一个新类。还有其他解决此类问题的方法吗?
综上所述:
- 易于维护:例如,添加一个或多个参数。
- 可扩展性:应用程序的第一个版本可以读取单个配置文件,但是更高版本可以提供多用户设置的可能性(管理员设置基本配置,用户只能设置某些设置,等等。)。
- 面向对象的设计。