函数命名规范

62

我正在编写一个库,因此希望其函数名称尽可能明确而聪明。目前,我使用以下原则:

  1. 自说明名称:例如getName()函数将向开发人员说明它返回什么以及setAddress()、isMale()等。
  2. 简短:函数名称必须尽可能短,以便于输入和记忆。getNumberOfPagesInTheBook()这样的函数名不好,像getBookPageCount()更好。
  3. 使用前缀:我总是在函数中使用前缀,例如getName()、setName()、hasHair()、isBlond()等。

我想知道是否有我遗漏的内容?另外,你能想到除了is、has、get和set之外的其他前缀吗?


6
这在一定程度上取决于语言,因为不同的语言通常有不同的命名/编码约定。 - skaffman
1
如果你有太多的getter和setter,它们可能是设计不良的指示。 - anon
@Neil Butterworth:有趣!好奇为什么,那么更好的方法是什么呢?(这是关于getter和setter的) - Madhu
2
如果你需要很多的get/set函数,那通常意味着你的类只是一个没有真正行为的“记录”。 - anon
@anon(2010年1月2日11:34)我不明白你的意思。问题是“有哪些好的命名约定?”你的回答似乎是对数据访问对象之类的东西半吐槽? - Byson
@Tower,你对这个问题有更多的想法了吗?我有一个类似的问题,尽管它是关于Objective-C的。所以如果一个方法返回一个值并执行一个操作,你会如何命名它?http://stackoverflow.com/questions/24154814/objective-c-naming-convention-for-method-performs-an-action-and-returns-a-value - Qiulang
7个回答

105

一个比较普遍而简单的规则是:如果函数改变程序状态,函数名应该是动词;如果用于返回某个特定值,则函数名应该是名词。


65
这意味着所有的getter函数名称都是错误的吗?比如getSomeValue(); - timh
2
@timh 是的,他们错了,这就是为什么 C# 用 get;set 属性修复了它们的问题。 - electricalbah
10
在具有命名闭包和可计算属性的语言中,这不是一个好的规则。对于具有这些功能的语言,更好的规则是始终将函数命名为动词或谓词。您必须考虑将函数存储为闭包时它会是什么样子。名词没有意义;这给人一种它是调用结果的印象。 - user652038
12
动词表示动作,函数执行任务。在所有函数名称中使用动词是合理的。 - Yetti99
4
使用名词函数名称对我来说没有意义。getHorse() 返回 horsehorse 是一个变量,不是你可以调用的东西。它可能是一个对象或字符串,但不是函数。它也可以是 makeHorseeditHorsedoAnythingWithHorse,但永远不是 horse()Horse 可能是一个类,所以我们可以像这样创建 horse 实例 new Horse(),但这不是在调用函数。 - ThaJay
显示剩余3条评论

16
写库时还有一件重要的事情要做,那就是每次描述相同的动作时使用相同的词语。不要在一个类中写一个名为“getName”的函数,在另一个类中写一个名为“retrieveNumber”的函数。

6
通常我会在数据从类变量本地获取或需要计算时使用 get(例如 circle.getArea()),然后当必须从外部获取数据时(例如从数据库中:db.retrieveUserById(123))我会使用 retrieve - David Callanan
2
@DavidCallanan,检索方法与调用者有何关联? - ThaJay
4
@ThaJay 两年后看这个可能与调用者数据来源无关,我会建议在所有地方都使用 get 方法。 - David Callanan
@ThaJay 这被认为是每个程序员都应该知道的原因与为什么这是一样的:https://colin-scott.github.io/personal_website/research/interactive_latency.html 在游戏的主循环中调用getArea,但retrieveArea可能不是你想要的,这是一个有用的提示。我没有看到提供这个提示的任何不利之处。 - undefined
在前端,我们使用 get 来获取本地数据,使用 fetch 来获取远程数据。所以从某种程度上说,我同意并且能理解这种区别的相关性。另外,getter 是同步的,而 fetcher 则不是。 - undefined

5
这是一个很好的资源,建议与卡尔的回答相同:追求流利使用

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

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

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


6
我认为这是一个相当糟糕的惯例,因为很多单词既可以作名词也可以作动词。即使在以下示例中:您可以distance yourself from something,并使用某种纸张获得print。 在实践中,我不知道x.view()x.set()x.route()哪个可能具有副作用。 - bluenote10


2

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

有些语言可以使用其他结构来表达“获取”和/或“设置”(特别是,在Common Lisp中,您可以使(setf(get * ...)blah)与您想要的(set * ... blah)相同)。


0

如果有一个普遍规则,我认为它应该是始终保持一致。

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

当涉及到非常简单的逻辑(例如属性)时,我更喜欢使用名词作为简单的获取器,但是对于复杂的操作,我会使用"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,...


0

Pro get/set

当一个类有很多方法时,最好使用动词前缀,如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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接