如何命名工厂的方法?

dea*_*mon 130 methods factory coding-style naming-conventions

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

createURI(...) 
makeURI(...)
produceURI(...)
buildURI(...)
generateURI(...)
Run Code Online (Sandbox Code Playgroud)

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

Jas*_*ams 103

一些随意的想法:

  • "创建"比大多数其他单词更适合该功能.我能想到的下一个最好的词是'Construct'.在过去,"Alloc"(分配)可能已经在类似的情况下使用,反映出比C语言中的对象更强调数据块.

  • "创造"是一个简短的单词,具有明确的直观含义.在大多数情况下,人们可能只是选择它作为他们希望创造某些东西时想到的第一个最明显的词.这是一种常见的命名约定,"对象创建"是描述创建对象过程的常用方法.

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

  • "构建"和"制作"是与编译代码相关的流程的常用术语,因此对程序员有不同的含义,这意味着一个流程包含许多步骤,可能包含大量磁盘活动.然而,工厂"构建"某物的想法是一个明智的想法 - 特别是在构建复杂数据结构的情况下,或者以某种方式组合许多单独的信息.

  • 对我生成'生成'意味着用于从输入生成值的计算,例如生成哈希码或随机数.

  • "生成","生成","构造"的输入/读取时间比"创建"更长.历史上,程序员喜欢使用短名称来减少打字/阅读.

  • @Fabian:“工厂”的直观目的是创建事物的新实例 - 您所描述的直观上并不是工厂,因为您并不真正知道它是否具有这种行为。例如,DI 容器可以创建类型(因此它类似于工厂),但也可以返回单例,因此通常我们发现容器使用“Get”或“Resolve”之类的名称来执行此操作,而不是“Create”(其中可能会产生误导)。 (4认同)
  • 竖起大拇指"创造" (3认同)

Jof*_*sey 92

"Effective Java"中的Joshua Bloch 提出了以下命名约定

valueOf - 返回一个松散地说与参数值相同的实例.这种静态工厂是有效的类型转换方法.

of - 一个简洁的替代valueOf,由EnumSet推广(第32项).

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

newInstance - 与getInstance类似,不同之处在于newInstance保证返回的每个实例都与其他实例不同.

getType - 与getInstance类似,但在工厂方法位于不同的类中时使用.Type表示factory方法返回的对象类型.

newType - 与newInstance类似,但在工厂方法位于不同类时使用.Type表示factory方法返回的对象类型.

  • 您如何评价“来自”?例如,采用假设的 `Id.of("abc")` 与 `Id.from("xyz")` ……或者 `from` 表明发生更多逻辑(即解析输入、从其他数据查找/关联) ,……)?搜索“of vs from”真的很难:D (3认同)

Iai*_*ain 21

想在其他答案中添加几点我没有看到.

  1. 虽然传统的"工厂"意味着"创造对象",但我更喜欢将其视为"给我一个行为与我期望的对象".我不应该总是知道它是否是一个全新的对象,实际上我可能并不在乎.因此,在适当的情况下,您可以避免使用"创建..."名称,即使这就是您现在正在实施的名称.

  2. Guava是工厂命名理念的良好存储库.它正在推广一个不错的DSL风格.例子:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    
    Run Code Online (Sandbox Code Playgroud)


Don*_*oby 9

"创造"和"制造"是短暂的,合理的令人回味,并且与我能想到的命名中的其他模式无关.我也经常看到它们,并怀疑它们可能是"事实上的标准".我会选择一个并至少在项目中使用它.(看看我自己当前的项目,我似乎使用"make".我希望我一致......)

避免"构建",因为它更适合Builder模式并避免"产生",因为它会唤起生产者/消费者.

为了真正继续模式的"工厂"名称的比喻,我会受到"制造"的诱惑,但这太长了.


Ama*_*dan 5

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

工厂方法(由传统的create)应该调用适当的构造函数。如果我看到buildURI,我会假设它涉及一些计算或零件组装(而且我不认为涉及工厂)。当我看到时,我想到的第一件事generateURI就是随机制作一些东西,比如新的个性化下载链接。它们并不完全相同,不同的词会产生不同的含义;但其中大多数都没有被约定俗成。


Fre*_*ald 5

我认为它源于“创建一个对象”。然而,在英语中,“创造”一词与“导致产生,作为一种不会自然进化或不是通过普通过程制造的独特事物”和“从一个人自己的思想或想象力,作为艺术作品或发明。” 因此,似乎为“创造”是正确的词来使用。另一方面,“制造”的意思是“通过塑造或改变材料、组合零件等来实现”。例如,你不是在创造一件衣服,而是在一件衣服(对象)。所以,在我看来,“制造”的意思是“生产”;导致存在或发生;“带来”对于工厂方法来说是一个更好的词。