Java规范分享
作者:风控 赵文豪
日期: 2019-5-29
一:数据库设计规范
1:命名规范
采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上 _ 组成;
命名尽量简洁,见名知意
Eg : lrm_product_name 风控产品名称 采用英文+下划线组成
一个库中的命名格式保持统一
不要一个表中出现多种不同字段格式 LrmProductName LRM_PRODUCT_NAME等等
建议全部使用小写加下划线 _
2:建表规范
1.建表时建议选择InnoDB引擎 utf-8字符集 所有的表和字段都要加上注释
想了解InnoDB引擎可以参考:
https://blog.csdn.net/tanliqing2010/article/details/81509539
2.设置主键为自增的id
主键作用:每行记录的唯一标识
想要详细了解主键可以参考:
https://blog.csdn.net/shellching/article/details/77367557
3.禁止使用外键,外键会导致表与表之间的耦合,影响性能,也有可能会造成死锁
想了解为什么不推荐使用外键可以参考
https://www.cnblogs.com/rjzheng/p/9907304.html
4.一个表建立的索引不要超过5个
索引可以增加查询效率,但是会影响插入和更新的效率
想要详细了解索引,可以自行百度
5.字段设置为非空并设置默认值
varchar类型默认为空字符串
注:每个表都需要有以下三个字段
add_time设置为datetime类型,默认值为 0000-00-00 00:00:00 用来记录添加时间
update_time设置为timestamp类型,默认值为ON UPDATE CURRENT_TIMESTAMP 用来记录更新时间
del_flag设置为tinyint类型,默认值为0 0:正常 1:逻辑删除
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP和CURRENT_TIMESTAMP区别
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
在创建新记录和修改现有记录的时候都对这个数据列刷新
TIMESTAMP DEFAULT CURRENT_TIMESTAMP
在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它
二:接口文档规范
接口文档命名:
项目 + 接口功能描述名 + 提供给谁 + 版本号 + 最后修改日期
eg:金服风控平台白名单查询接口_金服网站_V1.4_2018.12.27
在接口文档表头要有接口文档修改记录
对接口文档要有相关规范描述,是get请求还是post请求或者其它请求。
定义是什么编码格式
描述接口中需要用到的工具或者其它相关东西的使用说明;
如果项目通过注册服务调用,需要在文档中标明各环境调用域名以及ip
1:要有接口文档说明
2:接口路径 服务名称 负责人
3:有完整的入参/出参Demo样例
4:对入参出参有详细的说明,类型定义,是否必填,必要描述(如果枚举类型,需要列举枚举)
三:代码规范
1:命名规范
1:包名全是小写字母
2:类:首字母大写,如果一个类由多个单词构成,那么每个单词的首字母都大写,而 且中间不使用任何的连接符,尽量使用英文,如DemoController,DemoService等等。
业务调度层统一使用Controller结尾,业务处理层统一使用Service结尾。方便统一使 用切面处理。
3:方法:首单词全部小写,如果一个方法由多个单词构成,那么从第二个单词开始首 字母大写,不使用连接符。queryMethod()。
4:属性:与方法相同。如ageOfPerson,取名要见名知意;
禁止使用 通过Alt+Enter快捷键自动补全功能生成的 listByCondition或者 oneByCondition
无法直观区分变量代表的含义
当代码较复杂时,有可能会生成oneByConditon1 oneByCondition2...
造成代码比较混乱
5:常量:所有单词的字母都是大写,如果有多个单词,使用下划线拼接。
Eg:public static final int AGE_OF_PERSON = 20;
2:开发规范
1.类以及方法描述
对此类进行描述
对方法进行描述,具体功能是干吗的要说清楚
2.日志
每个方法的入口处要打印日志
logger.info("通过客户编号查询结果记录入参:{}", JSON.toJSON(reqDto));
如果需要打印多个参数,使用多个占位符进行打印
logger.info("reqDto:{}或custNo:{}为空,请求结束",reqDto,custNo);
对有可能出现异常情况的代码块进行异常捕获
使用 logger.error级别打印异常日志
禁止只打一行提示,没有打印相关信息
例如:
logger.info("客户编号查询结果为空");
logger.error("处理异常");
无法通过日志快速排查问题
3.代码可读性
开发过程中,对做一块共同功能的代码块抽取出一个新的方法
(例如封装数据,复杂的关联查询方法等等,会占据很多行代码,功能只是为了封装好一个对象或者查询到一个对象。这时候可以将这块代码抽取出来,封装成一个方法,主方法调用即可)。
养成添加注释的习惯。不然别说看别人的代码了,自己的代码过个几周都不知道写的是什么逻辑了。
这样主方法代码就会比较简洁,可以直观的看清这个方法的整个流程。很大程度上提高了代码的可读性。
4.保存基础参数
在开发过程中保存请求参数以及返回参数
比如:
作为接口提供方,建议在数据库中记录请求方的入参,请求时间。我们的返参以及处理时间。
作为接口调用方,建议在数据库中记录请求时发送的参数,请求时间,url,以及对方的全量反参,调用返回时间。(另:拿到调用方的返回时,先打印日志,保存,再进行解析转换等操作,不然可能会因为解析转换操作导致报错,以至于无法直观区分是否调用成功)
这样做好处在于可以加快排查问题的速度,重要的是:这个能做为甩锅的重要证据!
5.使用工具类
有现成的工具类的,尽量不要自己再重新手写
比如操作时间相关的可以用现成的 DateTimeUtils
5.禁止使用魔鬼变量
例如这种,如果不给注释的话,我根本不知道2代表的是是什么意思,代码的阅读难度大大增高
改造: 建一个常量类,用来放系统中用到的变量
变量命名规范要有注释,尽量做到见名知意
修改为这种格式:这种可以直观的看出来是 进件类型
6.统一返回格式
统一使用ResponseDto返参格式
禁止自己构造反参
Eg:
ResonseDto responseDto = new ResponseDto();
responseDto.setSuccess(“true”)
responseDto.setCode(1000000)
responseDto.setMsg(“请求成功”)
responseDto.setData(object)
return responseDto
统一使用ResponseUtil工具类构造ResponseDto
在ResponseCode中定义反参基本数据 code,msg,success
主体数据封装进data
完整的返参样例:
{
"success": true,
"msg": "请求成功",
"code": 10000,
"data": {
"result": "ADMIN_REFUSE"
}
}
7.列举一些阿里插件扫描出来的常见问题
对于静态变量或者静态方法,建议直接使用类名.变量/方法调用,不建议创建对象引用再调用。
及时清理不用的代码以及废弃的配置,不然系统丰富起来之后再维护就比较麻烦,等项目上线之后再改造项目会胆战心惊,会有可能造成意外事故。所以在一开始开发过程中就及时清理不必要的代码以及配置。
8.插件
必须安装 阿里规范插件,安装方法如下
使用插件扫描后,可以扫出项目中存在哪些不规范的地方,然后再针对性的进行修改
另推荐个人在用的插件
Free Mybatis plugin
在mapper文件和mapper.xml之间可以来回跳转
Mybatis Log Plugin
在控制台可以完整的看到SQL操作日志。省去了自己将参数带入参数再去数据库执行SQL的麻烦。
CamelCase
将不是驼峰命名的名称,选中 按 shift + alt + u 自动转换成驼峰命名
GsonFormat
根据j'son文本一键生成java类,当我们拿到接口文档时候,不需要一个个字段的去写实体类,将文档入参直接copy出来,一键生成实体类,非常方便。
有兴趣可以安装尝试一下
参考文献
CSDN
本片文章结合开发过程中遇到的问题以及参考以下文档完成
参考文献:
https://blog.csdn.net/zollty/article/details/85165434
https://blog.csdn.net/AAAAA_Alice/article/details/82144460