如何命名类似工厂的方法?

我想大多数类似工厂的方法都是从 create开始的。但是为什么它们被称为“ 创造”呢?为什么不是“ 制造”,“ 生产”,“ 建造”,“ 产生”或其他什么?这只是品味的问题吗?会议?或者“创造”有什么特殊含义?

createURI(...)
makeURI(...)
produceURI(...)
buildURI(...)
generateURI(...)

你一般会选择哪一个? 为什么?

61004 次浏览

一部分是约定,一部分是语义。

工厂方法(由传统的 create发出信号)应该调用适当的构造函数。如果我看到 buildURI,我会假设它涉及一些计算,或从零件组装(我不会认为有一个工厂涉及)。当我看到 generateURI的时候,我想到的第一件事就是做一些随机的东西,比如一个新的个性化的下载链接。它们并不完全相同,不同的词汇引起不同的意思; 但是它们中的大多数并没有被约定俗成。

一些随机的想法:

  • “创造”比大多数其他词语更符合这一特点。我能想到的第二个最好的词是“构造”。在过去,‘ Alloc’(分配)可能在类似的情况下使用,这反映出在像 C 这样的语言中,对数据块的重视程度高于对象。

  • “创造”是一个简短、简单的词,具有明确的直观含义。在大多数情况下,人们可能只是选择它作为第一个,最明显的词出现在脑海中,当他们希望创造一些东西。这是一个常见的变数命名原则,“对象创建”是一种常见的方式来描述... ... 创建对象的过程。

  • “构造”很接近,但它通常用于描述创建对象过程中的一个特定阶段(分配/新建、构造、初始化... ...)

  • “ Build”和“ Make”是与编译代码相关的过程的常用术语,因此对于程序员来说有不同的内涵,意味着一个包含许多步骤和可能大量磁盘活动的过程。然而,工厂“构建”某些东西的想法是明智的——特别是在构建了复杂的数据结构或者以某种方式组合了许多独立的信息的情况下。

  • 对我来说,“ Generate”意味着一个用于从输入生成值的计算,比如生成哈希码或随机数。

  • “生产”、“生成”、“构造”比“创建”的输入/读取时间更长。

我会叫它 UriFactory.Create()

在哪里,

UriFactory是提供创建 Uri实例的方法的类类型的名称。

Create()方法是重载的多达变化,你有在您的规格。

public static class UriFactory
{
//Default Creator
public static UriType Create()
{
}


//An overload for Create()
public static UriType Create(someArgs)
{
}
}

我要指出的是,我已经看到了所有的动词,但在某些图书馆或其他地方使用,所以我不会称创造为一个普遍的约定。

现在,创造对我来说听起来更好,唤起行动的确切意义。

所以,是的,这是一个(文学)品味的问题。

“创建”和“制造”都很简短,很容易引起共鸣,而且在命名方面与我能想到的其他模式没有联系。我也经常看到这两种情况,怀疑它们可能是“事实上的标准”。我会选择一个,并且至少在一个项目中始终如一地使用它。(看看我自己当前的项目,我似乎使用了“ make”。我希望我能坚持下去...)

避免“构建”,因为它更适合 Builder 模式,避免“生产”,因为它会唤起生产者/消费者。

为了真正延续模式的“工厂”名称的比喻,我会受到“制造”的诱惑,但这个词太长了。

工厂方法不指定方法名。您可以在工厂中使用任意多个方法,只要所有方法都从同一系列中返回对象。

有关详细信息,请访问网址 Http://xeon2k.wordpress.com

想补充一些我在其他答案中没有看到的观点。

  1. 尽管传统意义上的“工厂”意味着“创建对象”,但我更愿意将它更广泛地理解为“返回一个行为如我所期望的对象”。我不应该总是要知道它是否是 全新的物体,事实上我可能不在乎。因此,在适当的情况下,您可以避免使用“ Create...”名称,即使您现在就是这样实现它的。

  2. 番石榴是一个很好的工厂命名思想库。它正在推广一种漂亮的 DSL 风格。例子:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    

我认为它起源于“对 创造一个物体”。然而,在英语中,“创造”这个词与“使形成,作为一种独特的东西,不会自然进化或不是通过普通的过程制造出来”和“从一个人自己的思想或想象进化,作为一件艺术品或一项发明。”所以看起来“创造”是 没有的正确用法。另一方面,“ Make,”意思是“通过塑造或改变材料、组合部件等使之存在”。例如,你不是一件衣服,你是一件衣服(物体)。因此,在我看来,“ make”的意思是“生产; 使存在或发生; 带来”是工厂方法的一个更好的词。

Joshua Bloch 在《有效的 Java 》一书中提出了以下命名规范

ValueOf ー返回一个具有相同值的实例 这样的静态工厂是有效的 类型转换方法类型转换方法。

valueOf的简明替代品,由 EnumSet推广(第32项)。

GetInstance ー返回由参数描述的实例 但不能说具有相同的值。在单例的情况下, getInstance不接受任何参数,并返回唯一的实例。

NewInstance ー和 getInstance一样,只不过 newInstance保证 返回的每个实例都与其他实例不同。

Get类型 ー类似于 getInstance,但在工厂方法位于 类返回的对象类型 工厂法。

New类型 ー类似于 newInstance,但在工厂方法位于 类返回的对象类型 工厂法。

就个人而言,我喜欢 instantiateinstantiateWith,但这只是因为我的统一和目标 C 的经验。Unity 引擎中的命名约定似乎围绕着单词 instantiate,通过工厂方法创建一个实例,Objective C 似乎喜欢用 with来表示参数/s 是什么。只有当方法位于将要被实例化的类中时(在允许构造函数重载的语言中,这不是那么重要) ,这种方法才能真正有效。

只是简单的旧目标 C 的 initWith也是一个好‘ un!

我喜欢新的,对我来说

var foo = newFoo();

读起来比

var foo = createFoo();

翻译成英语我们有 foo 是一个新的 foo 或 foo 是创建 foo。虽然我不是语法专家,但我敢肯定后者在语法上是不正确的。