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

Coding style 如何命名类似工厂的方法?,coding-style,naming-conventions,methods,factory,Coding Style,Naming Conventions,Methods,Factory,我猜大多数类似工厂的方法都是从create开始的。但是,为什么它们被称为“”?为什么不能用“,”或别的什么?这只是品味的问题吗?会议?还是“创造”有特殊的含义 一般来说,你会选择哪一个?为什么?部分是惯例,部分是语义 工厂方法(由传统的create发出信号)应该调用适当的构造函数。如果我看到了buildURI,我会假设它涉及到一些计算,或者来自零件的组装(我认为不会涉及工厂)。当我看到generateURI时,我想到的第一件事就是随机创建一些东西,比如一个新的个性化下载链接。它们不尽相同,不同的

我猜大多数类似工厂的方法都是从
create
开始的。但是,为什么它们被称为“”?为什么不能用“,”或别的什么?这只是品味的问题吗?会议?还是“创造”有特殊的含义


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

部分是惯例,部分是语义

工厂方法(由传统的
create
发出信号)应该调用适当的构造函数。如果我看到了
buildURI
,我会假设它涉及到一些计算,或者来自零件的组装(我认为不会涉及工厂)。当我看到generateURI时,我想到的第一件事就是随机创建一些东西,比如一个新的个性化下载链接。它们不尽相同,不同的词会产生不同的含义;但大多数都不是传统的。

一些随意的想法:

  • “创建”比其他大多数词更适合该功能。我脑海中能想到的下一个最好的词是“构造”。在过去,“Alloc”(allocate)可能在类似的情况下使用,反映出比C等语言中的对象更强调数据块

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

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

  • “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) 
          {
          }
      }
      

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

      现在,create对我来说听起来更好,唤起了动作的确切含义

      因此,是的,这是一个(文学)品味的问题。

      “创造”和“制造”都很短,有一定的启发性,并且与我能想到的其他命名模式没有联系。我也经常看到这两种情况,并怀疑它们可能是“事实上的标准”。我会选择一个,并至少在一个项目中始终如一地使用它。(看看我自己目前的项目,我似乎使用了“make”。我希望我是一致的…)

      避免使用“build”,因为它更适合构建器模式,避免使用“product”,因为它会唤起生产者/消费者的兴趣


      为了继续模式中“工厂”名称的隐喻,我会受“制造”的诱惑,但这是一个太长的词。

      工厂方法不指定方法名称。如果所有方法都从同一个族返回对象,则工厂中可以有任意多个方法

      有关更多详细信息,请访问url
      想补充几点,我在其他答案中看不到

    • 虽然传统上“工厂”的意思是“创建对象”,但我更广泛地认为它是“返回一个行为符合我预期的对象”。我不应该总是知道它是否是一个全新的物体,事实上我可能不在乎。因此,在适当的情况下,您可能会避免使用“Create…”名称,即使您现在正在实现它

    • 番石榴是一个很好的工厂命名思想库。它正在普及一种不错的DSL风格。示例:

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

    • 我认为它源于“创建对象”。然而,在英语中,“创造”一词与“导致产生,作为一种独特的东西,不会自然演变或不是由普通过程产生的”和“从自己的思想或想象演变而来,作为一件艺术作品或一项发明”的概念相关联。因此,它似乎是“创造”这个词用起来不合适。另一方面,“Make”的意思是“通过塑造或改变材料、组合部件等使之存在”。例如,你不创造一件衣服,而是创造一件衣服(物体)。因此,在我看来,“make”的意思是“生产;导致存在或发生;带来”是一个更好的词,用于工厂方法。

      在“有效的Java”中

      valueOf-返回一个具有相同值的实例 作为其参数。这样的静态工厂是有效的 类型转换方法

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

      getInstance-返回由参数描述的实例 但不能说具有相同的价值。就单身人士而言,
      getInstance
      不接受任何参数并返回唯一实例

      newInstance-类似于
      getInstance
      ,除了
      newInstance
      保证 返回的每个实例都不同于所有其他实例

      getT
      Lists.newArrayListWithCapacity(100);
      ImmutableList.of("Hello", "World");
      
      var foo = newFoo();
      
      var foo = createFoo();