1.接口命名规范–Restful API
原本格式是动词+资源+by+传参,后来进化为Restful API,思想是以资源为中心。
动词用get,post,put,delete请求方法代替,by后面的名词用传参代替。 并且GET方法传参资源ID采用路径传参,除了资源ID外的GET传参统一采用query参数,而其他请求方法传参统一采用json参数。
原来
POST /getInfoByUserId
现在:
GET /user/{id}/info
另外:在嵌套资源的 URL 中使用关系
获取指定订单中所有商品列表。
GET /order/{id}/products
获取指定订单中所有指定商品信息。
GET /order/{orderId}/product/{productId}
其他细节:
【1】连接中多个不可分割的单词,使用中划线拼接。
/user/verify-code
【2】参数使用驼峰拼写
/order/{productId}
【3】指向集合的复数名称
例如:获取所有用户列表接口。
/users
【4】如果有一个接口,并不是 CRUD 操作,这种情况可以使用动词。
例如:向用户发送邮件接口。
/user/{id}/send-mail
2.三层方法命名规范–具体参照阿里巴巴命名规范
基本格式:动词+资源+by+传参
3.领域模型命名规约
- 数据对象–表对应的对象
xxxDO,xxx 即为数据表名。
- 数据传输对象–一般用于返回数据封装成类
xxxDTO,xxx 为业务领域相关的名称
- 展示对象–一般用于接收的数据封装成类
xxxVO,xxx 一般为网页名称。
注意事项:
POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。
4.MybatisPlus条件构造器命名规范
动词+query/update…+Wrapper
5.Java代码中的空格–一般用IDEA格式化解决
java代码哪里需要空格?
- 在运算符两侧需要空格,例如:
int result = a + b;
- 在逗号,分号,关键字后面需要空格 例如:
String[] names = {"Alice", "Bob", "Charlie"};
例如:for (int i = 0; i < 10; i++) {
例如:if (condition) {
- 在类名,方法名和左大括号之间需要空格 例如:
public class MyClass {
例如:public void myMethod() {
- 在类型转换时,强制类型转换符号与类型之间需要空格,例如:
(String) object
- 空实现接口或类不允许存在空格。
// 正例
public interface AdapterThreadPoolMonitor extends ThreadPoolMonitor {
}
// 反例
public interface AdapterThreadPoolMonitor extends ThreadPoolMonitor {
}
6.注释规范
【1】Class、Interface、Enum、@interface 等文件类型,类上注释仅需说明类的意图即可。不需要补充时间和创建人,因为往往开发代码的不止是一个人,容易造成信息干扰。需要的话,查看提交记录即可。
/**
* 适配第三方框架的线程池
*/
public interface ThreadPoolAdapter {
}
【2】方法上需添加注释,并说明清楚方法的意图(接口实现类无需注释);必要时描述 @param
@return
。
/**
* 适配第三方框架的线程池
*/
public interface ThreadPoolAdapter {
/**
* 修改框架线程池的核心参数
*
* @param threadPoolBaseInfo 修改线程池的基础参数
* @return 线程池核心参数修改结果
*/
boolean updateThreadPool(ThreadPoolBaseInfo threadPoolBaseInfo);
}
如果方法为内部引用方法,并且方法名称见名知意,无需方法注释。(私有方法尽量通过方法命名说明方法语义)
【3】方法内部的注释,应该新起一行,而不是跟在代码后面,除非是变量。
正例:
// 刷新动态线程池参数
refreshDynamicPool(parameter, executor);
反例:
refreshDynamicPool(parameter, executor); // 刷新动态线程池参数
7.其他
【1】静态变量使用大写,多个单词使用下划线连接。示例:MESSAGE_CENTER_SEND_TYPR。
【2】捕获的异常名称命名为 ex ;捕获异常且不做任何事情,异常名称命名为 ignored。
【3】返回值变量使用 result 命名;循环中使用 each 命名循环变量;map 中使用 entry 代替 each。
result 命名示范:
private void parseDate(String data) {
Result result = JSONUtil.parseObject(data, Result.class);
return result;
}
或采用 result 为前缀:
private void parseDate(String data) {
Result resultDate = JSONUtil.parseObject(data, Result.class);
return resultDate;
}
each 命名示范:
appNameLeaseMap.values().forEach(each -> appNameLeaseList.add(each));
或是 for 循环:
for (Lease<InstanceInfo> each : appNameLeaseMap.values()) {
appNameLeaseList.add(each);
}
【4】业务系统中优先使用 Guava、HuTool、Common3 等工具类中的方法,不存在指定方法时再创建自定义工具类,禁止创建相同语义方法的工具类。
备注:定义组件项目时,尽量使用自定义工具类,避免因版本问题导致不确定的异常。
【5】空实现接口或类不允许存在空格。
// 正例
public interface AdapterThreadPoolMonitor extends ThreadPoolMonitor {
}
// 反例
public interface AdapterThreadPoolMonitor extends ThreadPoolMonitor {
}
【6】超过 3 层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、 状态模式 等来实现,其中卫语句即代码逻辑先考虑失败、异常、中断、退出等直接返回的情况