【问题标题】:Function naming conventions [closed]函数命名约定[关闭]
【发布时间】:2010-01-02 11:25:57
【问题描述】:

我正在编写一个库,因此,我希望它的功能尽可能清晰和巧妙地命名。目前,我使用以下原则:

  1. 不言自明的名称:a 函数 getName() 将告诉 开发人员返回什么以及 setAddress()、isMale() 等
  2. 简短:函数名必须为 尽可能短,这样它 易于键入和易于 记住。一个函数 getNumberOfPagesInTheBook() 不是 好,类似的东西 getBookPageCount() 更好。
  3. 前缀的使用:我总是使用 函数中的前缀,例如 getName()、setName()、hasHair()、 isBlond() 等。

我很想知道我是否缺少某些东西。另外,除了is、has、get、set,你还能想出一些其他的前缀吗?

【问题讨论】:

  • 这在某种程度上取决于语言,因为不同的语言通常有不同的命名/编码约定。
  • getter 和 setter 可能表明设计不佳,如果它们太多的话。
  • @Neil Butterworth:有趣!很想知道为什么以及什么是更好的方法呢? (这是关于 getter 和 setter)
  • 如果您需要许多 get/set 函数,这通常表明您的类只是一个没有实际行为的“记录”。
  • @anon(2010 年 1 月 2 日 11:34)我不明白你的意思。问题是“什么是好的命名约定?”。您的回答似乎是对诸如数据访问对象之类的事半信半疑?

标签: function naming-conventions


【解决方案1】:

一个更通用但简单的规则是:如果函数改变程序的状态,函数名称应该是动词,如果它们用于返回某个值,则应该是名词。

【讨论】:

  • 所以这意味着getter函数都命名错误?...即getSomeValue();
  • @timh 访问器有点特殊,它们通常返回对象的属性,您只需在 C# 或 AS3 中使用属性访问语法。
  • @timh 是的,他们错了,这就是为什么 C# 用 get;set 属性修复了他们的问题
  • 在具有命名闭包和计算属性的语言中,这不是一个好的规则。对于具有这些特性的语言,一个更好的规则是始终将函数命名为动词或谓词。您必须考虑将函数存储为闭包时的样子。名词没有意义;这给人的印象是它是调用的结果。
  • 动词表示动作,函数做事。对所有函数名使用动词是合理的。
【解决方案2】:

编写库时要做的一件更重要的事情是每次都使用相同的词来描述相同的操作。不要在一个类中编写一个名为 getName 的函数,而在另一个类中编写另一个名为 retrieveNumber 的函数。

【讨论】:

  • 我通常使用get,当它从类变量本地获取数据并且或有一个计算(例如circle.getArea()),然后我使用retrieve,当它必须从外部,(例如来自数据库:db.retrieveUserById(123)
  • @DavidCallanan,它是如何与调用者相关的检索方法?
  • @ThaJay 两年后看这个,它可能与数据来源的调用者无关,我可能会在任何地方使用 get。
【解决方案3】:
【解决方案4】:

这是一个很好的资源,建议与@Carl 的回答相同:https://swift.org/documentation/api-design-guidelines/#strive-for-fluent-usage

根据副作用命名函数和方法

  • 那些没有副作用的应该读作名词短语,例如x.distance(to: y)i.successor()

  • 那些有副作用的应该读作祈使动词短语,例如, print(x)x.sort()x.append(y)

【讨论】:

  • 我觉得这是一个非常糟糕的约定,因为太多的词既是名词又是动词。即使在示例中:您可以从某事中distance 自己,并使用一些sort 的纸张获得print。在实践中,我不知道x.view()x.set()x.route() 中的哪一个可能有副作用。
【解决方案5】:

其他前缀?可能是“isa”,尽管这只适用于某些情况。

某些语言可以与其他结构交流“get”和/或“set”(具体来说,在 Common Lisp 中,您可以使 (setf (get* ...) blah) 执行与您想要的相同的操作 (设置* ...等等)做)。

【讨论】:

    【解决方案6】:

    如果有一个通用的规则,我认为应该是一致的。

    还有“on”前缀,在处理事件时被广泛使用(即Java Android:onViewCreated)。其他一些广泛使用的前缀或短和/或通用动词(例如 has、get 和 set)有:

    当涉及的逻辑很少(即属性)时,我更喜欢将名词用于简单的 getter,但我会为复杂的操作使用“get”前缀:

    func center() {
       return (a + b) / 2
    }
    

    但是,在一些显式使用“get”前缀被广泛扩展的语言中(即 Android - Java),通常的做法是使用一些动词,例如“compute”(即computeVerticalScrollOffset()

    此外,在某些语言中(例如swift),您还可以使用属性设置器,这样您就不会真正使用“set”前缀:

    var x: X {
      get {
        return foo(x)
      }
      set {
        x = bar(newValue)
      }
    }
    
    // Set x
    x = y
    

    最后,还有许多广泛使用的结构,例如instanceofindexOf、...

    【讨论】:

      【解决方案7】:

      专业获取/设置

      当一个类有很多方法时,最好使用动词前缀,例如get/set,来区分方法。

      PHP 示例:

      $foo->setText('Hello world!');
      $foo->prependText('So. ');
      $foo->appendText(' And welcome');
      $x = $foo->getText();
      

      顺便说一句,在匈牙利表示法中,前缀带有一个小写字母,不会减损关键字。

      计数器获取/设置

      当你只需要两个方法时,在使用参数的上下文中使用同一个名词会更容易。

      jQuery 示例:

      $('.foo').html();                //get
      $('.foo').html('Hello world!'); //set
      

      示例

      对于以数组为参数的函数和静态方法,我使用以下规则:

      如果更改只发生在运行时:

      setFoo($arr); // Replace/delete all properties, i.e. if some elements are not passed, the corresponding properties will get empty values.
      setFoo([]); // Delete all properties
      setFoo(); // Set all properties by default
      delFoo($arr); // Delete specified properties
      addFoo($arr); // Add/replace specified properties
      

      如果更改将永远进行(在数据库或文件中):

      deleteFoo(...); // Delete specified properties
      insertFoo(...); // Add specified properties
      replaceFoo(...); // Add or replace specified properties
      updateFoo(...); // Update specified properties
      

      对于这两种情况:

      $arr = getFoo(); // Get all properties    
      $val = getFoo($level1, $level2, ...); // You can obtain the value of the given level, placing the list of arguments
      or
      $val=getFoo()[$level1][$level2];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        • 2016-12-25
        • 2011-10-21
        • 2010-10-15
        • 2014-07-25
        • 2013-01-06
        相关资源
        最近更新 更多