0

オブザーバーの設計パターンがあり、必要なオブザーバーのアタッチ/デタッチは静的メソッドを介して行われます。ノードごとにオブザーバーのリストを保持すると、メモリの面で多くのコストがかかる可能性があるため、静的メソッドを意図的に使用しました。設計の観点から間違っている場合はお知らせください (静的メソッドと変数の使用は正しいですか?)。

    public static void Attach(FormComponentObserverBase observer)
    {
        observers.Add(observer);
    }

    public static void Detach(FormComponentObserverBase observer)
    {
        observers.Remove(observer);
    }

    public static void DetachAll()
    {
        if (observers == null)
        {
            return;
        }

        foreach (var o in observers)
        {
            Detach(o);
        }
    }

    public static void Notify(MyObservedObject c)
    {
        if (observers == null)
        {
            return;
        }

        foreach (var o in observers)
        {
            o.Update(c);
        }
}

オブザーバーは、ツリー オブジェクト構造を観察しています。ツリーはメモリの点で高価なので、余分なものをメモリに保持しないようにしたいと考えています。IDisposable インターフェイスを実装しようとしましたが、Dispose メソッドを使用して、オブザーバーやその他の不要なインスタンス関連オブジェクトをクリーンアップしたいと考えています。オブザーバーのジェネリック リストに関しては、オブザーバーのリストをガベージ コレクションの対象にするのに次の内容で十分でしょうか?

DetachAll();
observers = null; 
4

1 に答える 1

0

リストから実際にオブザーバーを削除すると仮定するとRemove、このデータ構造に関する限り、他に何もする必要はありません。を設定する特別な理由はありませんobservers = null。これにより、オブザーバーのリストに使用される少量のメモリが解放されるだけであり、nullあらゆる場所をチェックする必要があるため、コードが複雑になります。たとえば、あなたのDetachAllセットobservers = nullの場合、次のようAttachにする必要があります。

if (observers == null)
{
    // create observers list
}
observers.Add(observer);

オブザーバーはまだアクティブなオブジェクトである可能性があるため、メソッドでDisposeオブザーバーを呼び出すことはお勧めしません。Detach

おそらく、これを静的にしたくないでしょう。柔軟性とテスト容易性の観点から、インスタンス オブジェクトを使用することをお勧めします。プログラムが複数のインスタンスを作成できないようにする必要がある場合は、シングルトン デザイン パターンを実装できますが、おそらく必要ありません。

于 2013-03-05T16:32:28.647 に答える