目录
命名
- 类名使用 UpperCamelCase 风格,遵从驼峰形式 (例:MarcoPolo)
- 方法名、参数名、成员变量、局部变量使用 lowerCamelCase 风格,遵从驼峰形式 (例:localValue )
- 常量命名全部大写,单词间用下划线隔开
- 抽象类命名使用 Abstract 或 Base 开头
- 异常类命名使用 Exception 结尾
- 测试类命名以它要测试的类的名称开始,以 Test 结尾
- 枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。
-
Service / DAO 层方法命名规约
1 ) 获取单个对象的方法用 get 做前缀。
2 ) 获取多个对象的方法用 list 做前缀(习惯:getXXXList)。
3 ) 获取统计值的方法用 count 做前缀。
4 ) 插入的方法用 save( 推荐 ) 或 insert 做前缀。
5 ) 删除的方法用 remove( 推荐 ) 或 delete 做前缀。
6 ) 修改的方法用 update 做前缀(或modify)。
常量
不允许任何魔法值( 即未经定义的常量 ) 直接出现在代码中。
格式
不同的业务逻辑之间或者不同的语义之间插入一个空行。相同业务逻辑和语义之间不需要插入空行。
面向对象
- 所有的覆写方法,必须加@ Override 注
- Object 的 equals 方法容易抛空指针异常, 应使用常量或确定有值的对象来调用equals。例:” test ” .equals(object)
- 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
- 当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读。
- 类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter / setter方法。
集合处理
- 集合初始化时,尽量指定集合初始值大小。ArrayList 尽量使用 ArrayList(int initialCapacity) 初始化。
- 注意 Map 类集合 K/V 能不能存储 null 值的情况,如下表格:
集合类 | Key | Value | Super | 说明 |
Hashtable | 不允许为 null | 不允许为 null | Dictionary | 线程安全 |
ConcurrentHashMap | 不允许为 null | 不允许为 null | AbstractMap | 分段锁技术 |
TreeMap | 不允许为 null | 允许为 null | AbstractMap | 线程不安全 |
HashMap | 允许为 null | 允许为 null | AbstractMap | 线程不安全 |
控制语句
- 在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程 序将继续执行到哪一个 case 为止;在一个 switch 块内, 都必须包含一个 default 语句并且 放在最后,即使它什么代码也没有。
- 在 if/else/for/while/do 语句中 必须使用大括号,即使只有一行代码。
- 推荐尽量少用 else, if-else 的方式可以改写成:
if(condition){
…
return obj; }
// 接着写 else 的业务逻辑代码;
- 除常用方法(如 getXxx/isXxx)等外,不要在条件判断中执行其它复杂的语句,将复 杂逻辑判断的结果赋值给一个有意义的布尔变量名,以提高可读性。
注释
- 类、类属性、类方法的注释必须使用 Javadoc 规范,使用/**内容*/格式,不得使用 //xxx 方式。
- 所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、 异常说明外,还必须指出该方法做什么事情,实现什么功能。
- 所有的枚举类型字段必须要有注释,说明每个数据项的用途。
异常
- 异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低。
- 不能在 finally 块中使用 return,finally 块中的 return 返回后方法结束执行,不 会再执行 try 块中的 return 语句。
- 方法的返回值可以为 null,不强制返回空集合,或者空对象等, 必须添加注释充分 说明什么情况下会返回 null 值。
- 防止空指针异常(NPE)
1) 返回类型为包装数据类型,有可能是null,返回int值时注意判空。
反例:public int f(){ return Integer 对象}; 如果为 null,自动解箱抛 NPE。
2) 数据库的查询结果可能为null。
3) 集合里的元素即使isNotEmpty,取出的数据元素也可能为null。
4) 远程调用返回对象,一律要求进行NPE判断。
5) 对于Session中获取的数据,建议NPE检查,避免空指针。
6) 级联调用obj.getA().getB().getC();一连串调用,易产生NPE。
- 避免出现重复的代码(Don’t Repeat Yourself),即DRY原则。
日志
应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架
SLF4J 中的 API,使用 门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
单元测试
- 好的单元测试必须遵守 AIR 原则(感觉像空气(AIR)一样并不存在)。宏观上来说,具有自动化、独立性、可重复执行的特点。
- 单元测 试中不准使用 System.out 来进行人肉验证,必须使用 assert 来验证。
- 编写单元测试代码遵守 BCDE 原则
B:Border ,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。
C:Correct, 正确的输入,并得到预期的结果。
D:Design ,与设计文档相结合,来编写单元测试。
E:Error ,强制错误信息输入(如:非法数据、异常流程、非业务允许输入等),并得 到预期的结果。
MySQL开发规范
- 表名、字段名必须使用小写字母或数字;(例:getter_admin,task_config,level3_name)
- 小数类型为 decimal
- 如果存储的字符串长度几乎相等,使用 char 定长字符串类型。
- 表的命名最好是加上“业务名称_表的作用”。(例:tiger_task / tiger_reader / mpp_config)
- 库名与应用名称尽量一致。
- 字段允许适当冗余,以提高性能,但是必须考虑数据同步的情况。
- 单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
- 合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检 索速度。
索引规约
- 业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。
- 超过三个表禁止 join。需要 join 的字段,数据类型保持绝对一致;多表关联查询 时,保证被关联的字段需要有索引。
SQL规约
- 数据订正时,删除和修改记录时,要先 select,避免出现误删除,确认无误才能执行更新语句。
- in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控制在 1000 个之内。
对象关系映射(ORM)
- @Transactional 事务不要滥用。
- 配置XML文件时注意SQL注入问题。
安全规约
- 隶属于用户个人的页面或者功能必须进行权限控制校验。
- 用户敏感数据禁止直接展示,必须对展示数据脱敏。
- 用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入, 禁止字符串拼接 SQL 访问数据库。
- 用户请求传入的任何参数必须做有效性验证。
参数校验包括:
page size 过大导致内存溢出
恶意 order by 导致数据库慢查询
任意重定向
SQL 注入
反序列化注入
正则输入源串拒绝服务 ReDoS
- 禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。
- 表单、AJAX 提交必须执行 CSRF (Cross-site request forgery)安全过滤。
- 在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放限制, 如数量限制、疲劳度控制、验证码校验,避免被滥刷、资损。
- 发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过 滤等风控策略。
参考地址:阿里开发规范(精简版)_shijunwang的博客-CSDN博客_开发规范