为什么在Java方法名称中使用数字是错误的?

为什么在Java方法名称中使用数字是错误的?,java,methods,standards,Java,Methods,Standards,不久前,我记得有人告诉我不要在Java方法名称中使用数字。最近,我有一位同事问我为什么,我一辈子都记不起来了 根据Sun(现在是Oracle)的说法,方法名称的一般命名约定是: 方法应为动词,大小写混合 第一个字母小写,第二个字母为 每个内部单词的第一个字母 资本化 这并不是说数字不能被使用,尽管通过省略你可以看到它是不被建议的 考虑一下(我的同事所处的)情况,您希望根据特定年份执行一些逻辑,例如,2011年生效的新策略,因此您的应用程序必须根据信息进行操作,并根据其年份进行处理。常识告诉您可

不久前,我记得有人告诉我不要在Java方法名称中使用数字。最近,我有一位同事问我为什么,我一辈子都记不起来了

根据Sun(现在是Oracle)的说法,方法名称的一般命名约定是:

方法应为动词,大小写混合 第一个字母小写,第二个字母为 每个内部单词的第一个字母 资本化


这并不是说数字不能被使用,尽管通过省略你可以看到它是不被建议的

考虑一下(我的同事所处的)情况,您希望根据特定年份执行一些逻辑,例如,2011年生效的新策略,因此您的应用程序必须根据信息进行操作,并根据其年份进行处理。常识告诉您可以调用该方法:

boolean isSessionPost2011(int id) {}
if (buffer.isEmpty()) 
    buffer.append(word);
是否可以在方法名称中使用数字(尽管有标准的措辞)?若否,原因为何


编辑:“这并不是特别说不能使用数字,尽管通过省略,您可以看到这是不建议的。”也许我的措辞不正确。标准规定“方法应该是动词”。我读这篇文章是想说,考虑到数字不是动词,那么方法名就不应该使用数字。

标准Java类库中充满了带有数字的类和方法,如
Graphics2D
我们一直在使用它们,如您展示的示例所示。同样适用于接口版本,如
IConnection2
IConnection3

Eclipse也不会抱怨它是一个非传统名称。:)


但是可以接受吗?这取决于你。

是的,在某些情况下。例如,您可能希望处理X.509证书。我认为写一个名为
handleX509Certificate

的方法是完全可以接受的。这个方法似乎。。。过于具体

你不能改用:

boolean isSessionAfter(int id, Date date)
?


这样,下次您在特定日期之后对任何内容应用策略时,您就不需要复制粘贴旧方法并更改号码-您只需使用不同的日期来调用它。

永远不要忘记-规则是用来打破的。唯一的绝对值应该是没有绝对值。

我看到的在方法名称中使用数字的唯一问题是,这可能表明您的设计中有一些东西可以改进。(我不太愿意说“错了。”)例如,在你的例子中,你说你有一项具体的政策,该政策将在2011年后生效。然而,有一个方法专门检查那一年似乎过于具体和神奇的数字y。我建议创建一个通用函数来检查事件是否在Anon建议的指定日期之后发生


(Anon的回答是在我写了一半的时候突然出现的,所以如果我只是重复了他说的话,我表示歉意。我觉得我的回答是对他说的话的扩展,所以我想我还是把它贴出来。)

当然,在方法名称中使用数字是可以接受的。但根据你的例子,这就是为什么人们普遍不赞成它。假设2012年有一项新政策。现在,2014年有了一项新政策。也许到2020年!因此,有四种方法大致相同


您想要的不是布尔值,而是基于是否找到策略来执行某些操作或不执行任何操作的策略。因此,一种方法无效processPolicy(结构yourStructure);将是一个更好的方法-现在你可以屏蔽你正在进行基于一年的查找,并且不必每年都有单独的方法,或者甚至限制它每年只有一个策略(也许一个政策发生在两个不同的年份,例如,或者仅仅三个月)。没有确切的数字,但如果项目错过发布日期会发生什么?您将有一个名为post2011的方法,而现在应该称为post2012。把它称为后投影表示,也许是?

< p>数字的使用本身不是坏事,但通常不是很常见。

在特定的情况下,我认为
isSessionPost2011(intid){}
不是一个好名字。但是更好的是,
isSessionPostYear(int-id,int-year){}
更易于扩展,以备将来使用。

我不认为有理由避免标识符中的数字,尽管在您描述的情况下,我不知道我会使用它。相反,我将该方法命名为
布尔isPolicyXyzApplicable(intid)


如果这是一个预期会随着时间推移而改变的政策,考虑将政策分割成不同的类,这样你就不会结束一个长代码的< > >(IsRealX)…否则,如果(我的政策)。。。else if(isPolicyZ).在您的方法中。一旦考虑到这一点,请使用抽象或接口方法

策略。IsAppliedto(transaction)
和一组
策略
对象来确定要执行的操作。

事实上,这是一种编码约定,动词“应该”的使用表明在方法名称中允许使用数字,但建议不要使用数字。但是,在您的示例中,为什么不将相同的代码泛化为

session.isPostYear(int year);

只要你有使用数字的理由,我想这没关系

对于您的示例,可能有2个isSessionPost方法,那么您将如何命名它们?isSessionPost和isSessionPost2?老实说,不太清楚

请记住,所有名称都必须有意义,您不会出错。

关于此主题:

3.8标识符 标识符是Java字母和Java数字的无限长序列,其中第一个必须是Java字母

Java字母包括大写和小写ASCII拉丁字母
A-Z
\u0041-\u005a
)和
A-Z
\u0061-\
if (buffer.isEmpty()) 
    buffer.append(word);
"Hello" replace: "e" with: "x"