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是合适的。