Java方法名过长的标准是什么?

180
在过去的几周中,我看到有些人为一个方法或类使用非常长(50个字符)的名称,通常是在前提下认为这样可以提高可读性。我的看法是,像这样的长名称表明我们正在尝试在一个方法或类中做太多的事情,如果我们需要使用这样的长名称,那么这是一个指标。不过我想知道你们对此有什么看法。
例子:
getNumberOfSkinCareEligibleItemsWithinTransaction

20
是的,这是一种“代码异味”(code smell)... http://c2.com/cgi/wiki?LongMethodSmell - Dan Rosenstark
25
当字符数超过666个时,就意味着出现了问题。 - Thomas Eding
9
在你的例子中,“长方法”的相反词是“短方法”,被认为是一件好事。所以很明显它不是指方法名称,而是指代码行数(或类似的东西)。例如,f()是一个非常短的函数,但这肯定不是一个好习惯...你应该告诉一些编程数学家们 :) - sfussenegger
3
@sfussenegger,这是真的。但我打赌方法名长度和方法长度之间存在相关性。f()可能不是一个很好的函数,但$()在Javascript方法世界中就像一个摇滚明星。 - Dan Rosenstark
7
@yar,你提供的链接是指方法长度(即代码行数),而不是方法名称的长度。 - Thorbjørn Ravn Andersen
显示剩余14条评论
21个回答

5

方法本身的长度可能更能说明它是否做得过多,但即便如此也只是给你一个大致的想法。你应该追求简洁,但描述性更为重要。如果你无法用更短的名称传达相同的含义,那么该名称本身可能还可以接受。


4
下次当你要编写一个方法名时,可以考虑以下引用:
"The man who is going to maintain your code is a phyco who knows where you stay"

13
他只是海藻,而不是“精神变态者”,这一点非常好。 - StingyJack

2
那个方法名太长了。阅读这样长度的方法名时,我的思维容易游移不定。这就像读一句没有空格的话。
个人而言,我喜欢方法中尽可能少的单词。如果包和类名可以传达含义,那么你就会得到帮助。如果类的职责非常简明,就没有必要使用巨大的方法名。我很好奇为什么要加上“WithinTransaction”。
"getNumberOfSkinCareEligibleItemsWithinTransaction" 可以变成:
com.mycompany.app.product.SkinCareQuery.getNumEligibleItems();
然后在使用时,该方法看起来就像 "query.getNumEligibleItems()"。

2
变量名过长会影响整个程序或重要部分的可读性,因此应该使用更短的名称。
如果一个较长的名称可以传达有关值的更多信息,则可以使用。但是,如果名称太长,它将使代码混乱,并降低理解其余代码的能力。这通常通过导致换行并将其他代码行推出页面来发生。
关键是确定哪种方式会提供更好的可读性。如果变量经常使用或在短时间内多次使用,则最好给它一个简短的名称并使用注释进行澄清。读者可以轻松地参考注释。如果变量在整个程序中经常使用,通常作为参数或在其他复杂操作中使用,则最好缩短名称或使用首字母缩写作为读者的提示。如果他们忘记了含义,他们总是可以参考变量声明旁边的注释。
这不是易于权衡的决策,因为您必须考虑代码阅读器可能正在尝试理解的内容,并考虑代码如何随着时间的推移而改变和增长。这就是为什么命名东西很难的原因。
可读性是为什么使用i作为循环计数器而不是DescriptiveLoopCounterName是可以接受的。因为这是变量的最常见用途,您可以花费最少的屏幕空间来解释它的存在。较长的名称只会浪费时间,使理解如何测试循环条件或索引到数组变得更加困难。
另一方面,如果函数或变量很少使用,例如被传递给多参数函数调用,则可以为其提供过度描述性的名称。

1
与任何其他语言一样:当它不再描述函数执行的单个操作时。

1

我建议结合好的答案并且要合理。

完整、清晰、易读地描述该方法的作用。

如果方法名看起来太长,就要重构方法使其更简单。


1

当方法名称换行并且对该方法的调用是该行上唯一的内容,且距离边缘很近时,代码会显得过长。您必须考虑将使用它的人的屏幕平均大小。

但是!如果名称似乎太长,则可能确实太长了。解决方法是以这样的方式编写代码,即您在上下文中,并且名称很短但在其他上下文中重复。这就像在英语中可以说“她”或“他”而不是某人的全名。


1

当它过于详细地解释事情的相关内容时,会变得太长。

例如,这些名称在功能上是等价的。

在Java中:java.sql.SQLIntegrityConstraintViolationException

在Python / Django中:django.db.IntegrityError

请自问,在SQL / db包中,您还能想出多少种完整性错误类型?因此,db.IntegrityError就足够了。


你总是可以反过来争论。当它详细地解释了事情的本质时,方法的作用显然是清晰明了的,否则可能会引起混淆并导致方法的错误使用。 - Jonas Geiregat

0
当标识符名称超过您的Java编译器可以处理的长度时,它就会变得太长了。

3
什么?我不明白为什么我的回答会被踩。问题只要求提供一个充分条件,而不是必要条件! - uckelman

0

这里有两种观点或方式:一种是方法名的长度并不重要,只要尽可能地描述该方法正在执行的操作(Java最佳实践基本规则)。另一方面,我同意flybywire的帖子。我们应该利用智慧尽可能地缩短方法名,但不减少其描述性。描述性更为重要 :)


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