18

わかりました、私たちのほとんどが何度も使用しているこの一般的なイディオムを考えてみてください (私は推測します):

class FooBarDictionary
{
    private Dictionary<String, FooBar> fooBars;

    ...

    FooBar GetOrCreate(String key)
    {
        FooBar fooBar;

        if (!fooBars.TryGetValue(key, out fooBar))
        {
            fooBar = new FooBar();
            fooBars.Add(key, fooBar);
        }

        return fooBar;
    }
}

何か確立された名前はありますか?

(はい、C# で記述されていますが、「簡単に」C++ に転送できます。したがって、そのタグです。)

4

5 に答える 5

9

私はいつもそのような関数を呼び出しますobtainSomething()

于 2009-09-22T20:23:53.680 に答える
9

それはあなたがそれをしている理由に多少依存します-イディオムは、私が見たもので、メモ化、キャッシング、オンデマンドの初期化、初回使用時の作成と呼ばれるものです。通常、「GetOrCreate」ではなく「ensureFoo」メソッドを呼び出します

于 2009-09-22T20:25:18.980 に答える
5

遅延読み込み

http://en.wikipedia.org/wiki/Lazy_loading

于 2009-09-22T20:20:56.790 に答える
1

高レベル パターンの全体的なプログラミング名はわかりませんが、Perl にはAutovivificationと呼ばれる素晴らしい動作があります。つまり、ハッシュ内の存在しないキーの値を照会しているときに、未定義の値を持つハッシュ (マップ) キーを自動的に作成します。 .

于 2009-09-22T20:40:30.790 に答える
0

C#で...

...これを行う DefaultingDictionary<> があります。おまけとして

  • デフォルト値またはファクトリ関数を指定して、欠落しているキーの値を作成できます。
  • IDictionary<> からの暗黙的な変換が付属しています (辞書のラップ)
  • その場で任意の辞書を DefaultingDictionary<> に変換する拡張メソッドが付属しています

完全なコード:

拡張機能を使用.AsDefaultingして任意のディクショナリをデフォルトのディクショナリとして透過的に使用できるIDictionary<>ため、デフォルトのディクショナリとして任意のディクショナリ (サードパーティ API から取得したものも含む) を使用することを選択でき、基になるコンテナは「自動有効化」された任意のディクショナリで更新されます。アイテム。

のように使う

IDictionary<string, MyItem> dict = LoadFromDatabase();

// using a fixed value
SomeFunc(dict.AsDefaulting(defaultItem));

// using an independent generator function
var defaulting = dict.AsDefaulting(() => new MyItem { Id = System.Guid.NewGuid() });

// using a keydepedent generator function
var defaulting = dict.AsDefaulting(key => LazyLoadFromDatabase(key));

いくつかのテストケース

含まれています:

于 2012-05-25T19:10:30.853 に答える