函数名称中应该使用单数还是复数动词?

7

以Java标准库为例,为什么不叫做Object.equal而是Object.equals?为什么用单数形式的Object.clone而不是Object.clones?

为什么我看到几乎所有人在读取和设置对象属性时都使用getXXX和setXXX,而不是gets或sets?


1
因为你所有的“为什么不”的词形都不正确?但这并不是给英语课的地方,我也不是应该给它们的人。 - Bernhard Barker
1个回答

16
那些方法名是动词,而不是名词。 equals 是“equal”的第三人称形式(可能是疑问形式——在支持非字母数字字符的方法名中通常称为equals?),而clone是“clone”的第二人称命令形式(你正在命令对象:“克隆自己!”)。
一般来说,您会使用疑问动词来命名查询对象状态与另一个对象状态相对应的方法(例如:equalscontainshasXXX...),使用命令动词来命名让对象执行某些任务的方法(例如:cloneaddshow... 这些方法往往不返回任何值),以及使用名词来查询关于对象状态的信息而不引用任何外部内容的方法(例如:lengthintValuekeys)。请注意,这些名词可以是单数或复数,具体取决于方法返回的内容:如果只返回一个对象,则为单数(如length),如果返回列表/映射/其他容器,则为复数(如keys)。
Getter方法是一个特殊情况,其中您使用一个动作动词(get)将这些方法标记为getter方法,并与使用set的setter方法对称。
另外,getter和setter是C++和Java中缺少属性的解决方法。在没有这种缺陷的语言中,它们不存在:你可以使用属性代替,而那些是名词。

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