Java规范分享

作者:风控 赵文豪

日期: 2019-5-29

一:数据库设计规范

java规范分享

 

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

 

 

 

 

 

 

在接口文档表头要有接口文档修改记录

java规范分享

 

 

对接口文档要有相关规范描述,是get请求还是post请求或者其它请求。

定义是什么编码格式

描述接口中需要用到的工具或者其它相关东西的使用说明;

java规范分享

 

 

 

 

 

如果项目通过注册服务调用,需要在文档中标明各环境调用域名以及ip

java规范分享

 

1:要有接口文档说明

2:接口路径 服务名称 负责人

3:有完整的入参/出参Demo样例

4:对入参出参有详细的说明,类型定义,是否必填,必要描述(如果枚举类型,需要列举枚举)

java规范分享

 

 

 

 

三:代码规范

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代表的是是什么意思,代码的阅读难度大大增高

java规范分享

 

改造: 建一个常量类,用来放系统中用到的变量

      变量命名规范要有注释,尽量做到见名知意

java规范分享

修改为这种格式:这种可以直观的看出来是 进件类型

java规范分享

 

 

 

6.统一返回格式

统一使用ResponseDto返参格式

java规范分享

 

禁止自己构造反参

Eg:

ResonseDto responseDto = new ResponseDto();

responseDto.setSuccess(“true”)

responseDto.setCode(1000000)

responseDto.setMsg(“请求成功”)

responseDto.setData(object)

return responseDto

 

 

统一使用ResponseUtil工具类构造ResponseDto

java规范分享

 

在ResponseCode中定义反参基本数据 code,msg,success

主体数据封装进data

java规范分享

 

 

完整的返参样例:

{

    "success": true,

    "msg": "请求成功",

    "code": 10000,

    "data": {

        "result": "ADMIN_REFUSE"

    }

}

 

 

 

 

7.列举一些阿里插件扫描出来的常见问题

对于静态变量或者静态方法,建议直接使用类名.变量/方法调用,不建议创建对象引用再调用。

 

及时清理不用的代码以及废弃的配置,不然系统丰富起来之后再维护就比较麻烦,等项目上线之后再改造项目会胆战心惊,会有可能造成意外事故。所以在一开始开发过程中就及时清理不必要的代码以及配置。

 

 

8.插件

必须安装 阿里规范插件,安装方法如下

java规范分享

 

 

使用插件扫描后,可以扫出项目中存在哪些不规范的地方,然后再针对性的进行修改

另推荐个人在用的插件

 

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

 

 

相关文章:

  • 2021-09-24
  • 2022-12-23
  • 2022-12-23
  • 2022-02-19
  • 2021-09-01
  • 2021-07-22
  • 2022-12-23
  • 2021-09-15
猜你喜欢
  • 2022-01-12
  • 2021-11-25
  • 2021-10-23
  • 2021-09-01
  • 2021-11-23
  • 2022-12-23
相关资源
相似解决方案