Java方法名称何时太长?

Mex*_*ker 169 java methods

在过去的几周我已经看到了一些人使用很长的名字一个方法或类(50个字符),这通常是它提高了可读性的前提下,我的看法是,一个长的名字一样,这是一个指标,我们是如果我们需要这么长的名字,试图在方法类中做很多或者太多,但是我想知道你们对它的看法.

一个例子是:

getNumberOfSkinCareEligibleItemsWithinTransaction
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 390

当存在同样表达方法行为的较短名称时,Java或任何其他语言中的名称太长.

  • 因此,例如,`boolean doesShorterNameExistThatEquallyConvaysTheBehaviorOfTheMethod(String s)`应该重构为`boolean isTooLong(String s)`. (295认同)
  • 数学上优雅. (64认同)
  • @MAK @ S.Lott怎么样`getLength()`vs`length()`?我非常喜欢在输入'get'或'set'后查看自动填充 - 所以在这种情况下我更喜欢简洁的对话. (20认同)
  • @flybywire:任何让你写过长名字的惯例都有可疑的好处. (17认同)
  • 我不太同意,因为你不仅要传达行为,还要保持项目和语言的惯例.所以在Python中你可能会说`qualified_items_cnt`但是在Java中你通常会说`getEligibleItemsCount`. (6认同)
  • @flybywire:约定点(如Ruby on Rails人员所述)是为了减少必须明确陈述的细节.公约专门用于总结. (4认同)
  • @Ricket - 然而也是如此完全模糊,以至于没用. (3认同)
  • @sfussenegger:无处不在的get/set访问器是你打破封装的常见迹象; 例如,您应该使用length/resize方法而不是getLength/setLength.工具通过更新进行更改并被替换,我将基于某个特定编辑器的当前代码完成行为以外的其他内容来选择我的名称.(为什么你不能只输入一个句号并获得一个列表?无论如何,即使对于生成的文档,代码完成也是一个不好的替代品.) (3认同)
  • 缩写怎么样?它们将传达与非缩写版本完全相同的东西,但通常难以阅读. (2认同)
  • @flybywire:良好的约定可以让你简洁地表达更深刻,更丰富,更细致的意义.因此,如果惯例是好的,那么就不会有同样传达行为的简短名称. (2认同)

fly*_*ire 201

一些减少方法名称长度的技巧:

  1. 如果您的整个计划,课程或模块是关于'护肤品',您可以放弃护肤.例如,如果您的类被调用SkinCareUtils,那么就会带您前往getNumberOfEligibleItemsWithinTransaction

  2. 你可以改变,getNumberOfEligibleItemsInTransaction

  3. 您可以将事务更改为Tx,这可以帮助您getNumberOfEligibleItemsInTx.

  4. 或者,如果方法接受类型的参数,则Transaction可以完全删除InTx:getNumberOfEligibleItems

  5. 您可以通过计数更改numberOf: getEligibleItemsCount

现在这是非常合理的.它缩短了60%.

  • 我不喜欢像`Tx`,`Cnt`,`grph`等等......(顺便说一下,`Tx`是"Transmission"或"Transmitter"的缩写) (51认同)
  • 是的,我同意你的意见,直到你决定使用"Tx". (14认同)
  • 另外,5)将`getEligibleItems()`和`getEligibleItemsCount()`放在按字母顺序排列的列表中彼此相邻(例如autocompletion或javadoc) (11认同)
  • 对这个例子非常有用 (5认同)
  • 通常情况下,较短的名称符合ha句规则. (4认同)
  • +1,最佳答案.:-) (3认同)
  • @mercator使用getEligibleItems之类的标准约定而不是countEligibleItems可以减少语句中出现歧义的可能性.关于该方法应该做什么的不那么模糊增加了可读性.在没有进一步研究方法的情况下,"计数"的方法不如"获得"从长远来看完成的方法清楚. (2认同)
  • 6.`countEligibleItems` 7.`countEligible` 8.`qualited` - 因为它返回`int`你应该猜测它意味着数;)9.`el` (2认同)
  • @Bill:使用getEligibleItems我希望该方法返回一个item对象的集合,而不仅仅是count (2认同)
  • 德克萨斯州符合条件的物品。 (2认同)

Mar*_*ers 181

只是为了改变,一个非主观的答案:65536个字符.

A.java:1:字符串"xxxxxxxxxxxxxxxxxxxx ..."的UTF8表示对于常量池太长

;-)

  • 从技术上讲,Java语言规范没有标识符长度的上限.这是JVM实现的限制.干杯! (37认同)
  • +1为_THE_字面答案. (35认同)
  • Sun的编译器显然不符合规范.http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.8说:"标识符是一个无限长度的序列..." (13认同)
  • JVM规范_does_具有上限,正如错误消息所指出的那样.utf8的常量池表示限制为2 ^ 16字节[在此处指定](http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#7963).类名和方法名必须作为utf8存储在常量池中. (5认同)
  • 是的,当JVM无法处理它时,它太长了没有mo :) (4认同)

Epa*_*aga 41

我同意所有人的意见:方法名称不应该太长.我确实想添加一个例外:

但是,JUnit测试方法的名称可能很长,应该类似于句子.

为什么?

  • 因为它们没有在其他代码中调用.
  • 因为它们被用作测试名称.
  • 因为它们可以写成描述要求的句子.(例如,使用AgileDox)

例:

    @Test
    public void testDialogClosesDownWhenTheRedButtonIsPressedTwice() {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

有关此想法的更多信息,请参阅" 行为驱动设计 ".

  • +1我同意它,它也是我正在做的,虽然JUnit 4方法不再需要以`test`开头,这也打开了使用`should`的可能性:例如`dialogShouldCloseWhenTheRedButtonIsPressedTwice()`.或者你可以调用测试类`DialogShould`然后调用方法`closeWhenTheRedButtonIsPressedTwice()`,以便一起读它们:`DialogShould.closeWhenTheRedButtonIsPressedTwice()`. (5认同)
  • 虽然我同意,但我也建议太长的句子*可能*表明测试做得太多了! (3认同)

S.L*_*ott 17

上下文"......内部交易"应该是显而易见的.这就是面向对象的全部意义所在.

该方法是类的一部分.如果这个课程并不意味着"交易" - 并且如果它不能让你不必一直说"内部交易",那么你就会遇到问题.

  • 正如你从上面得分最多的答案中可以看出的那样,去内地简单而不是OO建议.+1 (3认同)
  • 也可以采取某种交易参数 (2认同)

sal*_*sal 12

我倾向于使用ha句规则来命名:

 Seven syllable class names 
 five for variables
 seven for method and other names
Run Code Online (Sandbox Code Playgroud)

这些是最大名称的经验法则.我只有在提高可读性时才会违反此规定.像recalculateMortgageInterest(currentRate,quoteSet ...)这样的东西比recalculateMortgageInterestRate或recalculateMortgageInterestRateFromSet更好,因为它涉及的速率和一组引号应该从嵌入式文档(如javadoc或.NET等价物)中非常清楚.

注意:不是真正的ha句,因为它是7-5-7而不是5-7-5.但我还是喜欢称它为ha句.

  • 课程得七,变量小于五,其余为七 (13认同)
  • "最多五个变量"(少于五个不准确) (8认同)

fly*_*ire 10

Java有一种鼓励长名称的文化,也许是因为IDE具有良好的自动完成功能.

这个站点说JRE中最长的类名InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState是92个字符长.

至于最长的方法名,我找到了这个supportsDataDefinitionAndDataManipulationTransactions,这是52个字符.

  • 看起来这个班级是由冗余部门雇用的命名人员命名的,以便在冗余部门命名. (20认同)

Jay*_*Jay 9

当一个小人物会做的时候,千万不要用长话.

我不认为你的论文"方法名称的长度与方法的长度成正比"确实有用.

举个例子:"getNumberOfSkinCareEligibleItemsWithinTransaction".这听起来像是它只做一件事:它计算交易中属于特定类别的项目数.当然,如果没有看到该方法的实际代码,我无法判断,但这听起来对我来说是一个好方法.

另一方面,我已经看到很多方法都有非常简短的名称,可以用来做很多工作,比如"processSale"或者流行的"doStuff".

我认为给出一个关于方法名称长度的强硬规则是很难的,但目标应该是:足够长的时间来传达函数的功能,足够短以便可读.在这个例子中,我认为"getSkinCareCount"可能已经足够了.问题是你需要区分什么.如果您有一个功能可以计算交易中符合护肤条件的物品,而另一个功能可以计算符合皮肤护理条件的物品,那么"内部交易"会增加价值.但如果在交易之外谈论这些项目并不意味着什么,那么就没有必要用这些多余的信息来捏造这个名称.

第二,我认为假设任何可管理长度的名称将告诉你除了最琐碎的案例之外的所有函数的确切含义,这是非常不现实的.一个现实的目标是创建一个名称,为读者提供线索,以后可以记住.就像,如果我试图找到计算我们需要消耗多少反物质以达到翘曲速度的代码,如果我查看函数名称并查看"calibrateTransporter","firePhasers"和"calcAntimatterBurn",很明显前两个不是它,但第三个可能是.如果我检查并发现那确实是我正在寻找的那个,那么很容易记住,当我明天回来再研究这个问题时.那太好了.

三个相似的长名称比短名称更令人困惑.如果我有两个名为"calcSalesmanPay"和"calcGeekPay"的函数,我可以快速猜一眼哪个.但如果他们被称为"calculateMonthlyCheckAmountForSalesmanForExportToAccountingSystemAndReconciliation"和"calculateMonthlyCheckAmountForProgrammersForExportToAccountingSystemAndReconciliation",我必须研究名称,看看哪个是哪个.在这种情况下,名称中的额外信息可能会适得其反.它将半秒钟的思考变成了30秒的思考.


Chr*_*röm 7

按照您希望的方式设计您的界面,并使实现匹配.

例如,也许我会把它写成

getTransaction().getItems(SKIN_CARE).getEligible().size()
Run Code Online (Sandbox Code Playgroud)

或者使用Java 8流:

getTransaction().getItems().stream()
    .filter(item -> item.getType() == SKIN_CARE)
    .filter(item -> item.isEligible())
    .count();
Run Code Online (Sandbox Code Playgroud)


Rex*_*err 6

我的规则如下:如果一个名字太长,以至于它必须出现在它自己的一行上,那么它太长了.(实际上,这意味着我很少超过20个字符.)

这是基于研究表明可见垂直代码行的数量与编码速度/有效性正相关.如果类/方法名称开始显着损害它,它们太长了.

在声明方法/类的位置添加注释,如果需要对其进行详细描述,请让IDE将其带到那里.


Bil*_*ard 5

方法本身的长度可能更好地指示了它是否做得太多,即使这样也只能给您一个大概的想法。您应该为简洁而努力,但描述性更重要。如果您不能用较短的名称传达相同的含义,则名称本身可能还可以。