获取或创建对象的方法有什么好名字?

Tor*_*var 47 naming-conventions

假设您有一个缓存,以及一个将执行以下操作的方法:

if (wanted Foo is not in cache)
    cache.Add(new Foo())
Return Foo from cache
Run Code Online (Sandbox Code Playgroud)

你会怎么称呼这种方法?GetFoo(),GetOrCreateFoo()还是其他什么东西(更好)?或者这真的应该分为两种方法吗?

Jas*_*ams 32

在大多数情况下,简单的GetFoo就足够了,因为调用者不需要知道您正在创建和缓存它.这就是封装的全部内容.

但是,在某些情况下,创建是一项昂贵的操作,因此知道您可能正在按需创建某些内容并在某些情况下它会很慢很有用.在这种情况下,不同的命名约定使调用者更清楚.在这种情况下,GetOrCreate()或Get(Options.CreateIfMissing)是调用者的一个很好的提示.

(当然应该在文档中注明这种行为,但是最好使用一个方法名称来提醒人们在阅读代码时会产生副作用,而不必为每个被调用的方法调出并阅读文档)

我发现这种情况最常见的情况是(例如)在找到树节点时(例如在Xml文档中),您可能有"CreateNode"(创建节点而不将其添加到树中)和"AddNode" (将现有节点添加到树中).在这种情况下,"添加节点(如果它尚不存在)"需要具有不同的描述性名称,因此我将使用类似"EnsureNodeExists"的内容来区分它并使目的明确.

  • 我喜欢“CreateIfMissing”措辞。好的! (2认同)

Ibr*_*ief 17

我知道我在这个问题上已经很晚了,但是我可以提议GrabFoo()将get-or-create-if-missing与它区别开来GetFoo()吗?

同义词Get,我看到几个合适的动词,一些已经常用作方法动词.例如,Fetch已经意味着从外部系统中获取内容.(例如数据库或网络)

Grab似乎很少使用,并且可能带有(虽然很弱)语义 I want you to get-or-create it, no matter what.

  • “抓取”一词的意思是“获得”,与“创造”没有任何含义。 (10认同)

Isi*_*lor 12

这话obtainacquire似乎很贴切。特别是obtain

拥有;通过努力或请求获得、获得或获得: 获得许可;以获得更好的收入。

可以说,在您的情况下,该方法的调用者获得了 foo。


Lou*_*eda 8

怎么样Getsert?来自getinsert,自updateinsertUpsert

虽然我没有看到任何流行的框架使用这个术语,但这符合@Jason Williams指出的想法:

  • 用户应该清楚它不会只是正常的获取
  • 您无需转到文档即可查看其功能
  • 易于拾取和直观?(我不确定)

  • 我认为 GetFoo() 不清楚,因为它不会让调用者知道如果对象尚不存在,他们是否会得到空结果。所以 Getsert 会更清楚。 (2认同)
  • 我喜欢 portmanteau 的想法,但是 `Getsert` 让我想到了 `get` + `assert`,它有不同的含义。 (2认同)

Vic*_*tii 6

我建议使用obtain. 我们在团队中制定了这一惯例,我们对此感到非常满意。

根据剑桥的定义:

获得:获得某物,尤其是通过索要、购买、为之工作或从其他东西中生产出来。

这正是我们所需要的。


Ofi*_*fir 5

我的偏好是GetFoo(),因为从调用者的角度来看,操作正在进行,缓存更像是一个实现细节.