例子:
getNumberOfSkinCareEligibleItemsWithinTransaction
在Java或其他语言中,如果存在一个同样能够表达方法行为的更短的名称时,使用较短的名称。
boolean doesShorterNameExistThatEquallyConvaysTheBehaviorOfTheMethod(String s)
应该重构为 boolean isTooLong(String s)
。 - Mark Bolusmjakeligible_items_cnt
,但在Java中,通常会说getEligibleItemsCount
。 - flybywiregetLength()
和 length()
有什么不同?我喜欢在键入“get”或“set”后查看自动完成 - 因此,在这种情况下,我更喜欢规范性而不是简约性。 - sfussenegger一些减少方法名称长度的技巧:
如果整个程序、类或模块都是关于“护肤品”的话,你可以省略“护肤品”这个词。例如,如果你的类名为SkinCareUtils
,则可以改为getNumberOfEligibleItemsWithinTransaction
。
你可以将within 更改为 in,从而得到 getNumberOfEligibleItemsInTransaction
。
你可以将 Transaction 更改为 Tx,这样就可以得到 getNumberOfEligibleItemsInTx
。
或者,如果该方法接受类型为Transaction
的参数,则可以直接省略“在Tx中”这部分: getNumberOfEligibleItems
。
你可以将numberOf 改为 count:getEligibleItemsCount
。
现在名称更加简单易懂了,并且长度缩短了60%。
getEligibleItems()
和getEligibleItemsCount()
放在按字母顺序排序的列表中相邻的位置(例如自动补全或Java文档)。 - sfussenegger为了换换口味,给出一个客观的回答:65536个字符。
A.java:1: 字符串“xxxxxxxxxxxxxxxxxxxx…”的UTF8表示对于常量池而言太长了
;-)
dialogShouldCloseWhenTheRedButtonIsPressedTwice()
。或者你可以将测试类命名为DialogShould
,然后将方法命名为closeWhenTheRedButtonIsPressedTwice()
,以便一起阅读:DialogShould.closeWhenTheRedButtonIsPressedTwice()
。 - stivlo@DisplayName
。例如:@DisplayName("当红色按钮被按两次时,对话框关闭")
- Navigatron"...WithinTransaction"这个上下文应该很明显。这就是面向对象的全部意义。
该方法是类的一部分。如果该类不表示“事务”--且如果它不能让你免于一直说“WithinTransaction”,那么你有问题了。
Java文化鼓励使用长名称,或许是因为IDE有良好的自动完成功能。
这个网站表示JRE中最长的类名是InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState
,长度为92字符。
至于最长的方法名称,我找到了这个supportsDataDefinitionAndDataManipulationTransactions
,长度为52个字符。
不必使用长词汇,能用简短的就好。
我认为你提出的“方法名长度与方法长度成正比例”这个观点并不一定正确。
以你举的例子为例:“getNumberOfSkinCareEligibleItemsWithinTransaction”。对我来说,它只做了一件事情:计算交易中属于某个特定类别的物品数量。当然,如果没有看到该方法的实际代码,我无法评判,但我认为这是一个好方法。
另一方面,我见过很多方法名称非常短,简洁,但却做了很多工作,例如“processSale”或者广受欢迎的“doStuff”等等。
我认为很难给出一个关于方法名长度的硬性规定,但目标应该是:足够长,以传达函数的功能,足够简短,易于阅读。在这个例子中,“getSkinCareCount”可能已经足够了。问题在于你需要区分什么。如果你有一个函数计算交易中符合美容保养条件的物品数量,另一个函数计算其他地方符合美容保养条件的物品数量,那么“withinTransactions”会增加价值。但如果在交易之外讨论这些物品没有任何意义,那么在名称中加入这些多余的信息就没有意义。
第二,我认为假设任何管理得当的长度的名称都能在除了最琐碎的情况下准确地告诉你函数的作用是极其不现实的。一个现实的目标是制定一个名称,给读者一个提示,并且稍后可以记住它。例如,如果我正在尝试找到计算我们需要消耗多少反物质才能达到超光速的代码,如果我查看函数名称并看到“calibrateTransporter”、“firePhasers”和“calcAntimatterBurn”,那么很明显前两个不是我要找的,但第三个可能是。如果我检查并发现那确实是我要找的那个,那么在明天回来继续解决这个问题时,很容易记住它。这已经足够好了。
长名称相似的情况比短名称更加令人困惑。如果我有两个函数分别叫做 "calcSalesmanPay" 和 "calcGeekPay",我可以快速猜出它们各自的含义。但如果它们被称为 "calculateMonthlyCheckAmountForSalesmanForExportToAccountingSystemAndReconciliation" 和 "calculateMonthlyCheckAmountForProgrammersForExportToAccountingSystemAndReconciliation",我就需要仔细研究名称以确定它们的含义。在这种情况下,名称中的额外信息可能会适得其反,将半秒钟的思考时间变成 30 秒钟。
我倾向于使用“俳句规则”来命名:
Seven syllable class names
five for variables
seven for method and other names
以下是关于最大名称的经验法则。只有在它能提高可读性时,我才会违反这些规则。像recalculateMortgageInterest(currentRate, quoteSet...)这样的命名比recalculateMortgageInterestRate或recalculateMortgageInterestRateFromSet更好,因为它嵌入了文档(如javadoc或.NET等)中明确包含利率和报价集的信息。
注意:这不是一个真正的俳句,因为它是7-5-7而不是5-7-5。但我仍然喜欢称其为俳句。
按照你想要的方式设计你的界面,使实现与之相匹配。
例如,我可能会这样写:
getTransaction().getItems(SKIN_CARE).getEligible().size()
或使用Java 8流式处理:
getTransaction().getItems().stream()
.filter(item -> item.getType() == SKIN_CARE)
.filter(item -> item.isEligible())
.count();
f()
是一个非常短的函数,但这肯定不是一个好习惯...你应该告诉一些编程数学家们 :) - sfusseneggerf()
可能不是一个很好的函数,但$()
在Javascript方法世界中就像一个摇滚明星。 - Dan Rosenstark