Language agnostic 用于创建某物的函数名,如果它是';现在还没有

Language agnostic 用于创建某物的函数名,如果它是';现在还没有,language-agnostic,function,coding-style,naming,Language Agnostic,Function,Coding Style,Naming,有时我会编写一个函数,如果它还不存在,则只创建一些东西,否则什么也不做。 像createFooifEssential()或EnsureThereIsAFoo()这样的名称确实有效,但它们感觉有点笨拙 你也可以说GetFoo(),但这个名字并不意味着可以先创建foo,它只在函数返回foo的句柄/指针/引用时起作用 熟悉英语的人能想出一个更好的方法来命名这些函数吗?这通常被称为惰性创建。LazyGetFoo()怎么样?更新 我现在更清楚了,所以会应用命令查询分离(CQS)。CQS说一个方法应该要么改

有时我会编写一个函数,如果它还不存在,则只创建一些东西,否则什么也不做。
createFooifEssential()
EnsureThereIsAFoo()
这样的名称确实有效,但它们感觉有点笨拙

你也可以说
GetFoo()
,但这个名字并不意味着可以先创建
foo
,它只在函数返回
foo
的句柄/指针/引用时起作用


熟悉英语的人能想出一个更好的方法来命名这些函数吗?

这通常被称为惰性创建。LazyGetFoo()怎么样?

更新 我现在更清楚了,所以会应用命令查询分离(CQS)。CQS说一个方法应该要么改变状态,要么返回结果,决不能两者都改变

因此,我目前的标准是:

Foo GetFoo(id); // Throws if Foo cannot be found for id
Foo FindFoo(id); // Returns null if the Foo cannot be found.
void CreateFoo(id[, args]); // Creates a Foo with supplied args.

旧的后忽略 我经常使用这个标准:

GetFoo(); // Always returns a Foo, so creates if there isn't one already.
FindFoo(); // Returns null if the Foo cannot be found.
在数据访问中特别有用,当您基于密钥加载员工或其他内容时,它可能存在,也可能不存在


具体来说,这是一个记录在案的编码标准。在代码库中工作的每个人都知道这个标准,并以同样的方式实现它。这就是我们如何摆脱这些相当通用的简短名称。

我将这些名称命名为
requirefo()
我会选择
ensurefo()
严肃地说:

issetFoo();
撒尿:

AreWeThereYetFoo(); helloFoo(); booFoo();

在我的Foo类中,我将使用GetExistingOrNew(Guid id)如何
这将返回一个现有的Foo(如果它存在),或者返回一个新的Foo。

所以你想成为一个创建者,对吗?然后

LetThereBeFoo();
呵呵

检查它是否存在

IsThereFoo();

我觉得只要有CreateFoo()就可以了。文档应说明函数在不同场景中的作用。查看一些文件I/O API,例如来自Win32 API的CreateFile(…)。根据参数,它将创建一个新文件或打开现有文件(如果存在)。您的不必基于参数,但它的行为可以根据程序的状态而有所不同。因此,从根本上说,我认为你的观点可能是相同的。

为什么不:

private FooType m_foo;

public FooType Foo
{
   get
   {
      if (this.m_foo == null)
      {
         this.m_foo = new Foo();
      }
      return this.m_foo;
   }
   set
   {
      this.m_foo = value;
   }
}

如果很清楚只存在一个Foo对象,我就将其称为CreateFoo(),因为您希望多个调用只创建一次对象

如果您要返回该值,我就将其称为GetFoo(),因为延迟加载(可能)是一个实现细节,因此,在接口中不应该很明显


如果可以创建多个Foo对象,但它们没有被返回,那么我不确定。一开始听起来很奇怪。

我最近开始使用
defineFoo()
因为我厌倦了
getOrCreateFoo()

如果这个方法不返回值,我会使用它。@gramm哈哈哈,我可以想象这个立场……虽然你的答案评分最高,但我还是选择了GetOrCreate。正如你所说,这必须是一个编码标准;否则它可能不明显。编码标准的要点是它不必明显。在变量前面加下划线并不表明它是私有成员变量,除非您已经知道这是一个标准变量。这里的想法是,你可以两全其美——很好的短名称,但是有一个文档化的标准告诉人们它们的意思。可以说,GetOrCreate有点抽象泄漏。您将处于以下情况之一:*Foo是内部管理的,您正在调用fooManager.getFoo()。如果是这样,打电话的人就不必在意了。这是一个问题。*Foo由外部管理,您正在分配一个:fooFactory.createFoo()。没有办法。Create应该在内部缓存或共享,而不做广告。*富是单身汉。没有什么可创造的。你就知道了。换句话说,要清楚谁管理Foos。哦,还有re:Neil的回答,一个可能失败的getFoo()应该抛出一个异常,而findFoo()可以不找到它,所以返回null是合适的。