Function 函数命名约定
我正在写一个库,所以,我希望它的函数被尽可能清晰和巧妙地命名。目前,我使用以下原则:Function 函数命名约定,function,naming-conventions,Function,Naming Conventions,我正在写一个库,所以,我希望它的函数被尽可能清晰和巧妙地命名。目前,我使用以下原则: 不言自明的名字:a 函数getName()将告诉 开发人员返回的内容以及 setAddress()、isMale()等 简短:函数名必须为 尽可能短,以便 简单的类型,以及易于使用 记得。函数 getNumberOfPagesInTheBook()不可用 很好,差不多 getBookPageCount()更好 前缀的使用:我总是使用 函数中的前缀,例如 getName(),setName(),hasHair()
- 的命名约定
- 的命名约定
- 的命名约定 其他前缀?可能是“isa”,但这仅适用于某些情况
- 编写库时,还有一件更重要的事情要做,那就是每次都用同一个词来描述同一个动作。不要在一个类中编写名为getName的函数,在另一个类中编写名为retrieveNumber的函数。一个更普遍但简单的规则是:如果函数更改程序状态,函数名应该是动词;如果函数名用于返回某个值,则应该是名词
一些语言可以与其他结构(特别是在公共Lisp中,您可以使(setf(get*..)blah)执行与您希望的(set*..blah)相同的操作)进行“get”和/或“set”通信。如果有一个通用规则,我认为它应该是一致的。 还有“on”前缀,它在处理事件时被广泛使用(例如Java Android:)。其他一些广泛使用的前缀或简短和/或一般动词(如has、get和set)有:
func center() {
return (a + b) / 2
}
然而,在一些明确使用“get”前缀被广泛扩展的语言中(即Android-Java),常见的做法是使用一些动词,如“compute”(即
此外,在某些语言中(例如),您还可以使用属性设置器,这样您就不会真正使用“set”前缀:
最后,还有许多广泛使用的结构,例如,…Pro get/set
当一个类有许多方法时,最好使用动词前缀(如get/set)来区分不同的方法
PHP示例:
$foo->setText('Hello world!');
$foo->prependText('So. ');
$foo->appendText(' And welcome');
$x = $foo->getText();
$('.foo').html(); //get
$('.foo').html('Hello world!'); //set
顺便说一句,在匈牙利符号中,前缀和一个小字母在一起,不会减损关键字
计数器获取/设置
当您只需要两个方法时,在使用参数的上下文中使用相同的名词更容易
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
如果将永远进行更改(在DB或文件中):
对于这两种情况:
$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];
这里有一个与@Carl的答案相同的建议: 根据其副作用命名功能和方法
- 没有副作用的应该读作名词短语,例如
,x.distance(to:y)
i.succession()
- 有副作用的应该读作祈使动词短语,例如。,
,print(x)
,x.sort()
x.append(y)
这在某种程度上取决于语言,因为不同的语言通常有不同的命名/编码约定。如果有太多的getter和setter,则可能表明设计不佳。@Neil Butterworth:有趣!好奇地想知道为什么以及什么是更好的方法?(这是关于getter和setter的)如果您需要许多get/set函数,这通常表明您的类只是一个没有实际行为的“记录”。@anon(2010年1月2日11:34)我不明白您的意思。问题是“什么是好的命名约定?”。你的答案似乎是对数据访问对象之类的东西半明半暗的反对?这意味着getter函数的名称都错了?。。。ie getSomeValue()@timh访问器是一种特殊情况,它们通常返回对象的属性,在C#或AS3中您只需使用属性访问语法即可。@timh是的,它们是错误的,这就是为什么C#用get修复了它们的属性;set property在具有命名闭包和计算属性的语言中,这不是一个好规则。对于具有这些特性的语言,更好的规则是始终将函数命名为动词或谓词。您必须考虑存储为闭包时函数的外观。名词没有意义;这给人的印象是它是调用的结果。动词表示动作,函数做事情。对所有函数名使用动词是合理的。当它从类变量本地获取数据或进行计算(例如
circle.getArea()
)时,我通常使用get
,当它必须从外部获取此数据时,我使用retrieve
(例如从数据库:db.retrieveUserById(123))
@davidcalanan,检索方法如何与调用方相关?@ThaJay两年后再看这个,它可能与调用方的数据来源无关,我可能会使用get-everywhere。我发现这是一个非常糟糕的惯例,因为这么多单词既是名词又是动词。即使在示例中:你可以距离从某物中编码>自己,并使用某种纸张获得打印件。实际上,我不知道x.view()
、x.set()
或x.route()
中的哪一种可能有副作用。
$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];