【强制】抽象类命名使用Abstract或Base开头
【强制】在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。
【强制】接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的javadoc
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。
【强制】注释的双斜线与注释内容之间有且仅有一个空格。
【强制】单行字符数不超过120个,超出则需要换行,换行时遵循如下原则:
1) 第二行相对第一行缩进4个空格,从第三行开始,不再继续缩进,参考示例。
2) 运算符与下文一起换行。
3) 方法调用的点符号与下文一起换行。
4) 方法调用中的多个参数需要换行时,在逗号后进行。
5) 在括号前不要换行,见反例。
【强制】外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。接口过时必须加@Deprecated注解,并清晰地说明采用的新接口或者新服务是什么。
【强制】任何货币金额,均以最小货币单位且整型类型来进行存储。
强制】关于基本数据类型与包装数据类型的使用标准如下:
1) 所有的POJO类属性必须使用包装数据类型。
2) RPC方法的返回值和参数必须使用包装数据类型。
3) 所有的局部变量推荐使用基本数据类型。
【强制】定义DO/DTO/VO等POJO类时,不要设定任何属性默认值。
【强制】序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。
【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中。
【强制】POJO类必须写toString方法。使用工具类source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。
【推荐】类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter方法。
【推荐】类成员与方法访问控制从严:
1) 如果不允许外部直接通过new来创建对象,那么构造方法必须是private。
2) 工具类不允许有public或default构造方法。
3) 类非static成员变量并且与子类共享,必须是protected。
4) 类非static成员变量并且仅在本类使用,必须是private。
5) 类static成员变量如果仅在本类使用,必须是private。
6) 若是static成员变量,必须考虑是否为final。
7) 类成员方法只供类内部调用,必须是private。
8) 类成员方法只对继承类公开,那么限制为protected。
说明:任何类、方法、参数、变量,严控访问范围。过于宽泛的访问范围,不利于模块解耦。思考:如果是一个private的方法,想删除就删除,可是一个public的Service方法,或者一个public的成员变量,删除一下,不得手心冒点汗吗?变量像自己的小孩,尽量在自己的视线内,变量作用域太大,无限制的到处跑,那么你会担心的。
【强制】日期格式化时,传入pattern中表示年份统一使用小写的y。大写的YYYY代表是week in which year
【强制】在日期格式中分清楚大写的M和小写的m,大写的H和小写的h分别指代的意义。 正确示范:"yyyy-MM-dd HH:mm:ss"
【强制】不允许在程序任何地方中使用:1)java.sql.Date 2)java.sql.Time 3)java.sql.Timestamp
【强制】在使用java.util.stream.Collectors类的toMap()方法转为Map集合时,一定要注意当value为null时会抛NPE异常。
【强制】判断所有集合内部的元素是否为空,使用isEmpty()方法,而不是size()==0的方式。
【强制】在subList场景中,高度注意对父集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生ConcurrentModificationException 异常。
【强制】在使用Collection接口任何实现类的addAll()方法时,都要对输入的集合参数进行NPE判断。
【强制】泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法,两者在接口调用赋值的场景中易出错。 说明:扩展说一下PECS (Producer Extends Consumer Super)原则:第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T>。
【推荐】使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。
【推荐】循环体中的语句要考量性能,以下操作尽量移至循环体外处理,如定义对象、变量、获取数据库连接,进行不必要的try-catch操作(这个try-catch是否可以移至循环体外)。
【强制】前后端数据列表相关的接口返回,如果为空,则返回空数组[]或空集合{}。
【强制】在前后端交互的JSON格式数据中,所有的key必须为小写字母开始的lowerCamelCase风格,符合英文表达习惯,且表意完整。
【强制】对于需要使用超大整数的场景,服务端一律使用String字符串类型返回,禁止使用Long类型。
【强制】在翻页场景中,用户输入的参数小于1,则前端返回第一页参数给后端;后端发现用户输入的参数大于最后一页,直接返回最后一页。
对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三个斜杠(///)来说明注释掉代码的理由
【强制】catch时请分清稳定代码和非稳定代码,稳定代码是本机运行且执行结果确定性高的代码。对于非稳定代码的catch尽可能进行区分异常类型,再做对应的异常处理。
【推荐】方法的返回值可以为null,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回null值。 说明:本规约明确防止NPE是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败,运行时异常等场景返回null的情况。 【强制】日志打印时禁止直接用JSON工具将对象转换成String。
【推荐】可以使用warn日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。如非必要,请不要在此场景打出error级别,避免频繁报警。 说明:注意日志输出的级别,error级别只记录系统逻辑出错、异常、或者重要的错误信息。
【推荐】谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。 说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
【强制】主键索引应以pk_开头,唯一索引要以uk_开头,普通索引要以idx_开头。
【强制】新增列必须在已有字段后面。
【强制】任何操作,都是先保存数据库成功后,再进行缓存的新增、更新、清除操作。
【强制】调用远程操作必须有超时设置。类似于HttpClient的超时设置需要自己明确去设置Timeout。
【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚举类型或者包含枚举类型的POJO对象。
【强制】表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint(1表示是,0表示否),此规则同样适用于odps建表。
【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。
【强制】小数类型为decimal,禁止使用float和double。
【强制】如果存储的字符串长度几乎相等,使用CHAR定长字符串类型。
【强制】varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为TEXT,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
【强制】表必备三字段:id, gmt_create, gmt_modified。
【强制】业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。
【强制】超过三个表禁止join。需要join的字段,数据类型保持绝对一致;多表关联查询时,保证被关联的字段需要有索引。
【强制】在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度。
【推荐】SQL性能优化的目标:至少要达到 range 级别,要求是ref级别,如果可以是const最好。
【强制】不要使用count(列名)或count(常量)来替代count(),count()就是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。
【强制】count(distinct col) 计算该列除NULL之外的不重复数量。注意 count(distinct col1, col2) 如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。
【强制】使用ISNULL()来判断是否为NULL值。
【强制】在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。
【推荐】SQL语句中表的别名前加as,并且以t1、t2、t3、...的顺序依次命名。
【推荐】in操作能避免则避免,若实在避免不了,需要仔细评估in后边的集合元素数量,控制在1000个之内。
【推荐】工具类二方库已经提供的,不要在本应用中编程实现。
json操作: fastjson
md5操作:commons-codec
工具集合:Guava包
数组操作:ArrayUtils(org.apache.commons.lang3.ArrayUtils)
集合操作:CollectionUtils(org.apache.commons.collections4.CollectionUtils)
除上面以外还有NumberUtils、DateFormatUtils、DateUtils等优先使用org.apache.commons.lang3这个包下的,不要使用org.apache.commons.lang包下面的。原因是commons.lang这个包是从JDK1.2开始支持的所以很多1.5/1.6的特性是不支持的,例如:泛型。
【强制】CR提交之后,必须3人参与并通过(不包括自己),其中1名必须是P7及以上同学。
【强制】涉及P1,P2故障场景,至少需要1名P8同学,1名P7同学参与并通过;涉及P3,P4故障场景,至少需要2名P7同学参与并通过。
【强制】CR 开始前,必须保证相关工具扫描(包括Code Style、规约及单元测试)等已经完成,测试用例全部通过。
【强制】在CR过程中,依照评审意见的任何一次改动都必须重新Review。
【强制】一个CR的大小要求:最大变更文件数<=10,单个文件的最大变更行数<=100。 不允许超过总行数1000行的变更。
【推荐】千行CR的评论个数必须超过2个。