“GetOrCreate” - 这个成语是否具有既定名称?

时间:2009-09-22 20:19:14

标签: c# c++ design-patterns idioms

好的,请考虑我们大多数人多次使用过的常见习语(我假设):

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 ++。因此该标记。)

5 个答案:

答案 0 :(得分:9)

我总是称这些函数为obtainSomething()

答案 1 :(得分:9)

这有点取决于你为什么这样做 - 这个成语是我所见过的被称为memoization,缓存,按需初始化,首次使用时创建的成语。通常我调用方法“ensureFoo”而不是“GetOrCreate”

答案 2 :(得分:5)

答案 3 :(得分:1)

我不确定高级模式的整体编程名称,但Perl有一个名为Autovivification的奇妙行为 - 即,当您查询值时,自动创建具有未定义值的哈希(map)键哈希中不存在的密钥。

答案 4 :(得分:0)

在C#...

...我有一个DefaultingDictionary&lt;&gt;关于这一点。作为奖金

  • 您可以指定默认值或工厂功能来创建缺失键的值:
  • 它来自IDictionary&lt;&gt;的隐式转换(包装字典)
  • 它带有扩展方法,可将任何字典转换为DefaultingDictionary&lt;&gt;在飞行中

完整代码:

扩展名.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));

一些测试用例

包括在内: