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

Cyn*_*ech 18 java methods standards

前段时间,我记得被告知不要在Java方法名称中使用数字.最近,我有一位同事问我为什么,为了我的生活,我记不起来了.

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

方法应该是动词,在第一个字母小写的大小写混合的情况下,每个内部单词的首字母大写.

Java的代码约定

这并没有具体说明数字不能使用,虽然有遗漏你可以看到它不被建议.

考虑一下您希望根据特定年度执行某些逻辑的情况(例如,一个在2011年生效的新政策),因此您的应用程序必须对信息采取行动并根据其年份对其进行处理.常识可以告诉你,你可以调用这个方法:

boolean isSessionPost2011(int id) {}
Run Code Online (Sandbox Code Playgroud)

是否可以在方法名称中使用数字(尽管标准的措辞)?如果没有,为什么?

编辑: "这并没有具体说明数字不能使用,虽然有遗漏你可以看到它不被建议." 也许我说错了.标准说'方法应该是动词'.我读到这个说,考虑一个数字不是一个动词,那么方法名称不应该使用数字.

Ebo*_*ike 34

标准的Java类库中充满了带有数字的类和方法,比如Graphics2D.

  • 但在那种情况下,"2"是什么意思?它没有提供有意义的信息.OP的2011年的例子,即使我们中的一些人有问题,至少给出了意义.简单地用新数字标记新版本绝对没有关于为什么应该优先考虑另一个版本的背景. (8认同)
  • 但是,我的观点是"2"意味着什么.查看接口定义,"LayoutManager2"的更好名称是LayoutConstraintManager,它仍然可以扩展LayoutManager,但提供了为什么要使用LayoutConstraintManager的上下文 - 为知道如何布置Container的类使用接口在布局约束对象上. (6认同)
  • 我会说像"LayoutManager2"这样的东西正是你想要避免的.`2`没有解释任何东西 - 如何`LayoutManager2`与`LayoutManager`有什么不同?我想用哪一个?然而,`isSessionPostInYear2011`是完全描述性的 - 2011年描述的内容本身就是一个数字. (4认同)
  • @ MetroidFan2002表示"界面版本2".接口在发布后是不可变的,因为如果添加任何方法,则会破坏实现该接口的所有类,如果删除任何方法,则会破坏使用该接口的所有类; 出于这个原因,他们选择定义一个扩展第一个的新接口,因为v2实现向后兼容v1使用者. (3认同)
  • `LayoutManager2`我休息我的情况,m'lud. (2认同)

Ano*_*on. 20

该方法似乎......过于具体.

难道你不能使用:

boolean isSessionAfter(int id, Date date)
Run Code Online (Sandbox Code Playgroud)

这样,下次在特定日期之后将策略应用于任何内容时,您无需复制粘贴旧方法并更改数字 - 您只需使用不同的日期来调用它.


Met*_*002 8

当然,在方法名称中使用数字是可以接受的.但按照你的例子,这就是为什么它通常不赞成.让我们说现在有一个新的政策到2012年.现在,有一个新的政策到2014年.也许2020年!所以,你有四种大致相同的方法.

您想要的不是布尔值,而是基于是否找到策略来执行某项操作或不执行任何操作的策略.因此,一个方法void processPolicy(Structure yourStructure); 这将是一个更好的方法 - 现在你可以屏蔽你根据年份进行查找,并且不必每年都有单独的方法,甚至每年只限制一个政策(可能是政策发生)例如,在两个不同的年份,或仅仅三个月).


Gre*_*ill 6

Java语言规范似乎相当具体的关于这一主题:

3.8标识符

一个标识符是无限长序列的Java字母爪哇位,其中第一个必须是一个Java字母.

...

Java字母包括大写和小写ASCII拉丁字母A-Z(\u0041-\u005a)和a-z(\u0061-\u007a),并且由于历史原因,ASCII下划线(_,或\u005f)和美元符号($,或\u0024).该$字符应仅用于机械生成的源代码,或者很少用于访问遗留系统上的预先存在的名称.

"Java数字"包括ASCII数字0-9(\u0030-\u0039).