2009-06-03 11 views
0

Settingクラスに実装されているいくつかのデフォルト設定に関連付けられているPersonのようなクラスがあるとします。これらの設定には、「デフォルトのタイトル」や「姓名」などがあります。これに対応して、Addressクラスのような他のクラスもいくつかのデフォルト設定を持つかもしれません。 Settingクラスは、各設定を永続ストアに保持します。静的メソッドまたはOO代替?

外部のメソッドが各オブジェクト型でSetDefaults()を呼び出すことができるように、これらの設定を含む "SetDefaults()"のような各クラスで静的メソッドを実装する必要がありますか?例えばPerson.SetDefaults()、次にAddress.SetDefaults()?

これを行うにはオブジェクト指向の方法がありますか?

は、[更新:SETDEFAULTS()がなく、オブジェクトが構築されるたびにより、特定の時点で外部のクラスから呼び出さなければならないため、これはコンストラクタにすることはできません]

+0

私はあなたがSETDEFAULTSの動作を説明する必要があると思う - オブジェクトはIoCの/工場が明確であるよりも、構築されたときに、これらのデフォルトは読み取り専用されている場合いい答えだ。建築後にリセットや他の状態変化の効果が期待されるなら、マークの拡張提案が最善の答えだと思うが、私はその時点でデザインに疑問を抱いている。 – annakata

答えて

3

...オブジェクトが直列化復元のようなもの、少なくともではない(通過する可能性があることを、すべて異なるユースケース与えられた - 設定終わる可能性それが意図されたものではないにもかかわらず、デフォルト値)。

ここで1つのオプションはIoCです。 StructureMapのようなIoCコンテナは初期化の後にプロパティを設定することができ、それは呼び出し元のコードから抽象化されます。

もう1つのオプションは、テンプレートインスタンス(静的)なんらかの種類のインスタンスであり、そのインスタンスは値をコピーできます。しかし、私はこれがいくつかのシナリオでは危険だと思います。また、異なるスレッド(おそらくWebサーバー上の要求)に異なるデフォルトが必要な場合にも問題が発生します。 [ThreadStatic]は、良いオプションではありません(オプションですが)。

デリゲートまたはイベントメカニズムを介してユーザー設定可能なファクトリを提供することもできますが、私はという理由でというシナリオが必要な場合があります。私はよく見たことがない...


再更新:外部クラスのみが使用する場合。それはおそらく、(むしろこれについて何かを知らPersonクラスより)拡張メソッドのようなものを使用することができます

public static class PersonExt { 
    public static void SetDefaults(this Person person) { 
     // your code 
    } 
} 

Personクラス約SetDefaultsを気にしないように聞こえるので、これはからロジックを離婚しますPersonがきれいです。

+0

拡張メソッドの考え方は面白いと思います。唯一の欠点は、静的な(クラスメソッド)とは異なり、検出が難しいことです。 – Aryeh

+0

押すよりも検出が難しい。それをインテリセンスで見ていますか? –

+0

なぜ私はintellisenseで* tool *を使用していると仮定しますか? – Aryeh

1

設定されていない理由これらのデフォルトは、(コンストラクター内で)オブジェクトを作成するときのデフォルトです。 デフォルトは-imho-そのプロパティに特定の値が与えられていないときにプロパティに割り当てるべき値なので、オブジェクトが作成されたときにそのデフォルト値を設定することをお勧めします(コンストラクタで、または工場を経由して)。

または、何か不足していますか?

+0

SetDefaults()メソッドは、オブジェクトが構築されるたびにではなく、外部クラスによって呼び出される必要があるためです。 – Aryeh

+1

@JBadda - あなたはこれらのデフォルトの値がどんなものになるのかを設定することを意味しますか?インスタンスのリセットではありませんか?私は静的な(すなわちメタメソッド)は理にかなっていると思うが、それ以上の柔軟性はない - 設定オブジェクトを注入する依存関係よりも、必要ならばインターフェースされる – annakata

-1

Abstract factory patternを実装し、設定したファクトリを設定することもできます。あるいは、IoCinjecting dependencyとしてこの工場クラスに使用することもできます。 Presonため

単純なファクトリクラスは、以下の見ることができます:

public class PersonFactory 
{ 
    private readonly ISettings settings; 

    public PersonFactory(ISettings settings) 
    { 
    this.settings = settings; 
    } 

    public Person Create() 
    { 
    Person p = new Person(); 
    // ... you code for populating person's attributes form settings. 
    return p; 
    } 
} 
+0

私はこれらのどちらかが問題に直接的に対処しているか確信している。 – Aryeh

0

私はコンストラクタでそれらを置くと思います。私はデフォルトが真にスパニングされている多くの機会を考えることはできません

class Person 
{ 
    public Person() 
    { 
    this.Settings = MakeDefault(); 
    } 

    public Person(Settings settings) 
    { 
    this.Settings = settings; 
    } 
} 
+0

コンストラクタに入れることはできません - トピックの更新を参照してください。 – Aryeh

+1

なぜdownvoteですか?私はこの回答を掲示したときに、その制限を指定しなかった。私はすべての質問を追跡することができませんし、彼らは何かを意味するように編集されたとき –

+0

あなたの完全に合理的な苦情と共感してアップしました:) –

0

すべてのクラス(Person、Address)の設定をカプセル化する設定クラスを作成できます。

あなたが言う人のためにデフォルト設定を設定できます。これは上の削減と同じようにあなたはまた、値がどこかに記憶装置から検索されている場合は特に、あなたが望んだ場合には、このデータを格納するためにシングルトンを使用することができ

// Injected 
Settings settings; 
Setting personSetting = new ...; 

... 
settings.StoreSettingsFor(typeof(Person), personSettings); 
0

ストレージがアクセスされた回数。

(このインスタンスストレージでは、データファイル、レジストリ、データベースことができます。)

関連する問題