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 )、 等々。
アプリケーションが起動するとすぐに設定をロードする必要があると仮定します。つまり、アプリケーションによって実行される最初の操作は設定をロードすることです。設定の無効な値は、自動的にデフォルト値に置き換えられる必要があります:これが関連する設定のグループに発生した場合、それらの設定はすべてデフォルト値で設定されます。
これらの操作を実行する最も簡単な方法は、最初にすべての設定を解析し、次に読み込まれた値をチェックし、最後にデフォルト値を設定するメソッドを作成することです。ただし、このアプローチを使用する場合、メンテナンスは困難です。アプリケーションの開発中に設定の数が増えると、コードの更新がますます難しくなります。
この問題を解決するために、次のようにTemplate Methodパターンを使用することを考えていました。
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;
}
}
問題は、この方法では、単一の値であっても、設定ごとに新しいクラスを作成する必要があるということです。この種の問題に対する他の解決策はありますか?
要約すれば:
- 簡単なメンテナンス:たとえば、1つ以上のパラメーターの追加。
- 拡張性:アプリケーションの最初のバージョンは単一の構成ファイルを読み取ることができますが、それ以降のバージョンではマルチユーザーセットアップの可能性があります(管理者は基本構成をセットアップし、ユーザーは特定の設定のみを設定できます)。
- オブジェクト指向設計。