Java开发规范之命名篇(下)

阿里巴巴早在2017年就推出了《Java开发手册》,旨在规范Java开发人员在开发过程中的编码,这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本。

为了让开发者更加方便、快速的将规范推动并实行起来,阿里巴巴基于手册内容,研发了一套自动化的IDE检测插件, 该插件在扫描代码后,将不符合手册规范的代码显示在界面中。我们可以在IDEA中选择 Preferences - Plugins - Browse repositories ,输入框中输入"alibaba",选择"Alibaba Java Coding Guidelines"进行安装,重启IDEA后即可使用。

Google也在2016年推出了《Java编程规范》,它是Google公司对Java编程风格规范的完整定义,主要内容包含编码格式是否美观的问题, 同时也讨论一些约定及编码标准。国内已经有人将其翻译为中文,具体请参考 Google《Java编程规范》中文版 ,另外如果需要PDF文档可以在 这里 去下载 。另外在Eclipse IDE和 IntelliJ IDE可以导入代码风格配置文件,可以方便使用该编码规范,请点击 传送门,具体方法是依次点击 Window -> Preferences -> Java -> Code Style -> Formatter -> Import,导入下载文件后即可使用。

本系列文章将结合两个《Java规范》进行总结,通过具体编码案例给出编码规范的原因,如果总结内容存在问题还望指出。


目录

11.缩写

12.避免随意命名

13.常量与变量表示类型的名词放在词尾

14.设计模式体现在命名中

15.接口类方法和属性不加修饰符

16.接口和实现类命名

17.枚举类型命名

18.各层命名规约


本篇文章内容承接上一篇文章《Java开发规范之命名篇(上)》,进一步介绍Java开发的命名规范,主要针对阿里巴巴规范条目,同时结合Google规范。由于阿里巴巴规范比较详细,文章内容顺序以该规范为准。

11.缩写

【Alibaba 】杜绝完全不规范的缩写,避免望文不知义。

【Google】比起其它类型的名称,局部变量名可以有更为宽松的缩写。虽然缩写更宽松,但还是要避免用单字符进行命名,除了临时变量和循环变量。

说明:不正确的缩写会误导理解代码功能含义

反例:【Alibaba 】AbstractClass“缩写”命名成AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。

区别:Alibaba规范更加严格,避免国人不熟悉英文单词而不规范的命名,Google规范只在局部变量名提到缩写规范但也只是避免单字符命名

补充:由于母语不是英语,中国开发人员开发过程经常会出现这个问题,但缩写问题也不能一概而论,不同的公司应该都会有自己的标准,只要统一标准这类问题也可以很好解决

12.避免随意命名

【Alibaba 】为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达其意。

【Google】类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语,方法名通常是动词或动词短语,常量名和非常量名通常是名词或名词短语,参数和局部变量名应该避免用单个字符命名。类型变量可以是单个的大写字母,后面可以跟一个数字(如:E, T, X, T2),或者以类命名方式,后面加个大写的T(如:RequestT, FooBarT)。

说明:随意命名是不负责任的行为,后期项目维护对他人阅读极不友好

正例:

【Alibaba 】在JDK中,表达原子更新的类名为:AtomicReferenceFieldUpdater。

【Google】定义泛型类:EmployeeDOMapper<T> / EmployeeDOMapper<E>,定义泛型变量 ArrayList<T> / ArrayList<E>

反例:【Alibaba 】int a的随意命名方式。

区别:Alibaba和Google规范都在强调单词命名,但Google对不同类型命名更加严格

补充:在IDEA中一般定义变量会自动提示写法,可以参考修正

13.常量与变量表示类型的名词放在词尾

【Alibaba 】在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。

【Google】未做类似要求

说明:该要求只是推荐,这种方式可以更好识别变量和常量

正例:【Alibaba 】startTime / workQueue / nameList / TERMINATED_THREAD_COUNT

反例:【Alibaba 】startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD

14.设计模式体现在命名中

【Alibaba 】如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式。

【Google】未做类似要求

说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。

正例: 【Alibaba 】public class OrderFactory  /  public class LoginProxy  /  public class ResourceObserver

15.接口类方法和属性不加修饰符

【Alibaba 】接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的Javadoc注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。

【Google】未做类似要求

说明:JDK8中接口允许有默认实现,那么这个default方法,是对所有实现类都有价值的默认实现。

正例:【Alibaba 】接口方法签名 void commit(); 接口基础常量 String COMPANY = "alibaba";

反例:【Alibaba 】接口方法定义 public abstract void f();

16.接口和实现类命名

【Alibaba 】接口和实现类的命名有两套规则: 1)对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别。 2)如果是形容能力的接口名称,取对应的形容词为接口名(通常是–able的形容词)。

【Google】未做类似要求

说明:如果接口和实现类不按照规则定义会引起歧义,上述规则只是推荐,可以自定义其他规则

正例:【Alibaba 】CacheServiceImpl实现CacheService接口。AbstractTranslator实现 Translatable接口。

17.枚举类型命名

【Alibaba 】枚举类名带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。

【Google】未做类似要求,适用于其它类的格式规则也适用于枚举类。

说明:枚举其实就是特殊的类,域成员均为常量,且构造方法被默认强制是私有。

正例:【Alibaba 】枚举名字为ProcessStatusEnum的成员名称:SUCCESS / UNKNOWN_REASON。

18.各层命名规约

【Alibaba 】

A) Service/DAO层方法命名规约

  • 1) 获取单个对象的方法用get做前缀。
  • 2) 获取多个对象的方法用list做前缀,复数形式结尾如:listObjects。
  • 3) 获取统计值的方法用count做前缀。
  • 4) 插入的方法用save/insert做前缀。
  • 5) 删除的方法用remove/delete做前缀。
  • 6) 修改的方法用update做前缀。

B) 领域模型命名规约

  • 1) 数据对象:xxxDO,xxx即为数据表名。
  • 2) 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
  • 3) 展示对象:xxxVO,xxx一般为网页名称。
  • 4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

【Google】未做类似要求

说明:该规范适合团队开发,这样规范非本人开发功能可以快速定位使用,一般大公司都会有这样的要求。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章