web-dev-qa-db-ja.com

構成設定の問題に適用できる設計パターンはどれですか?

大規模で複雑なソフトウェア製品では、構成可能な設定を管理することが大きな苦痛になります。私が問題に対して見た2つのアプローチは次のとおりです。

  • システム内の各コンポーネントに、構成ファイルまたはレジストリ設定から独自の構成をロードさせます。
  • すべての構成可能なシステム設定をロードし、各コンポーネントがその設定を設定ローダーに照会する設定ローダークラスがあります。

これらのアプローチはどちらも私にとって間違っていると感じています。

問題を単純化するために使用できる設計パターンはありますか?たぶん、依存性注入手法を利用するものです。

71
paxos1977

クエリの設定、読み込み、保存のためのインターフェイスを作成することを好みます。依存性注入を使用することにより、これを必要とする各コンポーネントに注入できます。

これにより、構成戦略を置き換えるという点で柔軟性が得られ、すべてが機能するための共通の基盤が提供されます。特に、どうしても必要な場合に単一のコンポーネントの構成メカニズムをオーバーライドできるため、これは単一のグローバルな「設定ローダー」(オプション2)よりも好みます。

43
Reed Copsey

現在、構成キーの値へのマップを保持する1つのグローバルシングルトンオブジェクトによって構成が管理されるシステムで作業しています。一般に、システムで同時実行性のボトルネックを引き起こす可能性があり、ユニットテストなどでだらしないため、この方法で実行しないでください。

Reed Copseyにはその権利があると思います(私は彼に投票しました)が、依存性注入に関するMartin Fowlerの素晴らしい記事を読むことを絶対にお勧めします。

http://martinfowler.com/articles/injection.html

ちょっとした補足も...もしあなたがモックオブジェクトタイプの単体テストをしたいなら、依存性注入は間違いなく行く方法です。

18

これはどう。単一のメソッドconfigure(configuration)でインターフェースConfigurableを定義します。構成引数は、構成パラメーターの名前とその値を関連付ける単なるハッシュテーブルです。

ルートオブジェクトは、希望する方法で構成ハッシュテーブルを作成できます(例:構成ファイルからの読み取り)。このハッシュテーブルには、ルートオブジェクトiselftの構成パラメーターと、そのコンポーネント、サブコンポーネント、サブサブコンポーネント(など)のいずれかが使用する可能性のあるパラメーターが含まれている場合があります。

次に、ルートオブジェクトは、その構成可能なすべてのコンポーネントでconfigure(configuration)を呼び出します。

4
Alain Désilets