好的,请考虑我们大多数人多次使用过的常见习语(我假设):
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 ++。因此该标记。)
答案 0 :(得分:9)
我总是称这些函数为obtainSomething()
。
答案 1 :(得分:9)
这有点取决于你为什么这样做 - 这个成语是我所见过的被称为memoization,缓存,按需初始化,首次使用时创建的成语。通常我调用方法“ensureFoo”而不是“GetOrCreate”
答案 2 :(得分:5)
答案 3 :(得分:1)
我不确定高级模式的整体编程名称,但Perl有一个名为Autovivification的奇妙行为 - 即,当您查询值时,自动创建具有未定义值的哈希(map)键哈希中不存在的密钥。
答案 4 :(得分:0)
...我有一个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));
包括在内: