函数名字太长的标准是什么?

52

我尽可能在函数名中使用描述性语言。这有时会导致函数名过长,例如GetActionFromTypeNameGetSelectedActionType等二三十个字符的函数名。那么函数名何时变得太长难以管理(而不是编译器过长)?


22
当你使用没有代码自动补全功能的编辑器时,函数名会变得太长。 - schnaader
2
当我使用vim时,我的函数名称的长度相同。 - C. Ross
1
好的,vim用户也倾向于能够写得很快。总的来说,程序员往往具有更好的打字技能...但是使用代码自动完成仍然更好。 - schnaader
4
这个问题的意义是什么?当程序员觉得函数名称太长时,函数名就太长了。我们无法告诉你,作为编写代码的程序员,是否觉得名称太长。 - jalf
6
@jalf,问一些“有趣”的问题没关系,对吧?这是其中之一,此外和其他人一起思考它也很有好处。 - C. Ross
显示剩余4条评论
27个回答

5
这可能有点跑题,但是由于您特别要求一个“函数”名称指南(而不是说方法),我想引用Linus Torvalds关于命名的观点(尽管它更多地涉及变量,但原则仍然适用)。

第3章:命名

C是一种简约语言,因此你的命名也应该如此。与Modula-2和Pascal程序员不同,C程序员不使用像ThisVariableIsATemporaryCounter这样可爱的名称。 C程序员会将该变量称为“tmp”,这样更容易书写,而且并不难理解。

短而具有描述性的名称非常适合短而专业的函数......这非常适合代码重用。

4

当你在提到它们的名字时,开始使用缩写词时,我认为这就是太多了。当人们开始在名称中描述前/后/参数条件或给出实现提示时,我也觉得这太过分了。(例如getVersionInformationFormTheDatabase()doSomethingWithoutCheckingFooFirst()


3

在我看来,函数名应该恰好描述其目的所需的长度。如果您认为函数名太长,则可能表明它试图做太多事情,需要进行重构。


3

在我看来,函数的描述性更为重要。IDEs可以帮助我们避免拼写错误这样的麻烦。我认为有时使用缩写是可以接受的,只要它们在代码中保持一致即可(同一事物不使用不同的缩写,也不要将两个不同的事物使用相同的缩写)。


2
只要函数的名称真正做到了它们所承诺的功能,且你不是在追求代码极简,我认为这是一件好事。

2

我认为你应该更加关注函数名是否太短或者不够描述。只要你的函数做到了它名字所描述的(包括所有描述),那么它就是一个良好的命名。我经常写一些长名称的函数,例如getPropertyNameArrayFromObject(虽然我倾向于使用下划线而不是驼峰式命名),它可以被称为getObjPropArr或其他什么,但是这样并不够描述性。我倾向于避免缩写,因为当你去处理其他事情并回到代码时,它们会变得模糊。

另一方面,考虑许多内置的PHP函数,如stricmp,其实应该被命名为caseInsensitiveStringComparison之类的东西。

还有一些情况,我故意编写非常短且没有描述性的函数名。有时我只是想要一个简短的JavaScript函数作为快捷方式。例如,我通常将$(id)别名为document.getElementById(id),因为我厌倦了打这个。


2
啊,一个没有答案的问题!
我倾向于发现如果我不能用几个词概括它,那么设计上就有问题(从《代码大全》中抄袭)。
所以,虽然我对FindArticlesWithoutTitles感到满意,但我可能会对FindArticlesWithoutTitlesThenApplyDefaultStyles感到厌恶。这是错误的;要么名称过于技术化,不描述其实际功能(没有标题的文章通常需要修复样式,因此应该是FixArticleStyles),要么它应该是两个函数:FindArticlesWithoutTitles/ApplyDefaultStyles
另外:频率也有很大关系。如果经常使用它,我希望它简短,以减少代码的刺眼程度;长而重复的名称使得代码难以阅读,打起来很麻烦。如果我总是找到FindArticlesWithoutTitles,根据适当的上下文,我可能会将其缩短为FindNoTitles,甚至只是FindArticles,如果我没有其他文章查找函数。

1
请注意,在这个例子中,使用完整的描述性标题命名函数的习惯是发现设计缺陷的关键。通过发现正确的名称应该是“查找没有标题的文章并应用默认样式”,您实际上发现该函数正在做太多的事情。缩写名称的倾向会掩盖这一事实。让您的名称具有描述性。如果描述过长,请缩短函数而不是名称。 - Rob Napier
但我认为这并不是那么简单,一个人的冗长对于另一个人来说可能是简洁明了的。我有一个函数,它会打开一个文件,读取文件的每一行,验证并与数据库行进行比较,任何不在数据库中的内容都将存储在 C# 字典中。听起来很多,但将其拆分成几个函数会使阅读变得更加困难。将其包装在一个名为 LoadSymbolsFile 的函数中更简单,这在类的上下文中是有意义的。该函数是私有的,并且只被调用一次。 - Joel Goodwin

2

当名称中包含从上下文中明显的信息(例如incrementInteger(int x),long longID),无用的信息(例如ObsoleteIncrementer,RobertsCarFactory),难以理解的信息(例如TheFunctionThatRobertWorkedOnLastWeekButDidntFinish),数字信息(例如id1,id2,id3)或者包含代码异味时,应该进行修剪。请注意,即使上述名称的某些部分应该被修剪,您可能仍需要使用有用的信息来填充它们,以保持它们的唯一性并使它们易于理解,例如将id1命名为person_id,将id2命名为employer_id等。


2

函数的名称太长了,使用一个更短的名称可以省下一些工作。

通常情况下,我们选择描述性的函数名称是因为它可以帮助我们省下一些工作(通过使代码更易理解和维护)。因此,逻辑上来讲,你不应该给函数取一个过长的名字,否则会浪费额外的时间(例如,让代码变得更难阅读)。


1
问自己一个更有趣的问题:为什么我们要把函数名取得那么长?这是为了描述函数的作用。我提出这个假设:
“函数名中所需的描述量与其可用类型信息量成反比例关系。”
为了说明这一点,如果你看到一个像这样的函数……
public <A> A id(A a);

...你认为它会做什么?类型信息告诉你所有你需要知道的。除了副作用和异常,这个函数只可能做一件事情。

当然,你可能在使用允许无限制副作用的语言,所以这个函数可以写入文件。但如果它这样做了,那么它的类型就是一个谎言。在声明类型效果的语言中工作,可以使用非常简洁的名称,而不会失去任何描述性。


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