假设你有一个缓存,并且有一个方法会执行以下操作:
if (wanted Foo is not in cache)
cache.Add(new Foo())
Return Foo from cache
你会如何命名这个方法? GetFoo()
, GetOrCreateFoo()
还是其他更好的方法名?或者应该将其拆分为两个方法?
假设你有一个缓存,并且有一个方法会执行以下操作:
if (wanted Foo is not in cache)
cache.Add(new Foo())
Return Foo from cache
你会如何命名这个方法? GetFoo()
, GetOrCreateFoo()
还是其他更好的方法名?或者应该将其拆分为两个方法?
GetFoo
就足够了,因为调用者不需要知道你正在创建和缓存它。这就是封装的全部意义。GetOrCreate()
或 Get(Options.CreateIfMissing)
是对调用者的很好提示。CreateNode
(创建节点而不将其添加到树中)和 AddNode
(将现有节点添加到树中)。在这种情况下,“如果节点不存在,则添加一个节点”的操作需要使用不同的、具有描述性的名称来区分它并清晰地表达其目的,因此我会使用类似于 EnsureNodeExists
的东西来加以区分。get
方法。但在这种情况下,你可能不是在寻找特定的键,而是要查找某些列的特定值,因此可以使用 getFooByWhatever
方法(当然实际上不会使用 whatever
)。 - MartijnGetsert
如何?从 get
或 insert
,既然 update
或者 insert
是 Upsert
虽然我还没有看到任何流行的框架使用这个术语,但它符合 @Jason Williams 指出的思想:
get
单词obtain
和acquire
似乎非常适合。特别是obtain
:
获得;通过努力或请求而得到、获得或取得:获得许可;获得更好的收入。
在您的情况下,可以说该方法的调用者获得了foo。
我知道这个问题已经很晚了,但是我能否提议将GrabFoo()
作为创建新值并获取现有值的约定,以使其与GetFoo()
区分开来?
查看“get”的同义词,我看到了几个适合的动词,有些已经常用作方法动词。例如,Fetch
已经暗示着从外部系统中获取一些东西(例如数据库或网络)。
Grab
似乎很少使用,并且可能带有一个(虽然弱的)语义:无论如何都要获取或创建它。
我的偏好是GetFoo()
,因为从调用者的角度来看,该操作是获取数据,并且缓存更多地是实现细节。
我会称其为GetFoo
,因为调用者并不关心它是否会得到一个新的或已经创建的Foo
- 它只是想要Get
一个Foo
。
对于缓存,我会简单地称其为GetFoo()
。缓存旨在充当数据源后面的门面,以便调用者可以轻松访问项目,而不必担心它们如何或不被加载。
我会称其为GetFoo
,但文档指出,如果请求的对象不在缓存中,则缓存将加载它(可能会产生所有潜在的性能影响)。
Beget
以下是几个似乎适合的定义:
这个词也可以分为你问题中的两个想法。
“一个获取或创建对象的好方法名是什么?”
Be = 创建
Get = 获取
此外,它非常简短。
另一种选择是Resolve。
我从Autofac那里借用了这个单词,它使用Resolve方法来获取对象的实例,或者在需要时创建对象。
我使用Take
而不是Get
。原因如下:
take
也有点像make
take
与get
具有相同的含义take
听起来比get
更有力量,所以如果我无法get
它,我就会直接take
它