add code check
This commit is contained in:
69
.obsidian/workspace.json
vendored
69
.obsidian/workspace.json
vendored
@@ -13,7 +13,7 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Java 并发包中并发队列原理剖析.md",
|
"file": "代码规范/代码规范.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"backlinks": true,
|
"backlinks": true,
|
||||||
"source": false
|
"source": false
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "backlink",
|
"type": "backlink",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Java 并发包中并发队列原理剖析.md",
|
"file": "代码规范/代码规范.md",
|
||||||
"collapseAll": false,
|
"collapseAll": false,
|
||||||
"extraContext": false,
|
"extraContext": false,
|
||||||
"sortOrder": "alphabetical",
|
"sortOrder": "alphabetical",
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "outgoing-link",
|
"type": "outgoing-link",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Java 并发包中并发队列原理剖析.md",
|
"file": "代码规范/代码规范.md",
|
||||||
"linksCollapsed": false,
|
"linksCollapsed": false,
|
||||||
"unlinkedCollapsed": true
|
"unlinkedCollapsed": true
|
||||||
}
|
}
|
||||||
@@ -135,7 +135,19 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "outline",
|
"type": "outline",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Java 并发包中并发队列原理剖析.md"
|
"file": "代码规范/代码规范.md"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "0a9c61a29e6fab2b",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "all-properties",
|
||||||
|
"state": {
|
||||||
|
"sortOrder": "frequency",
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -157,33 +169,35 @@
|
|||||||
},
|
},
|
||||||
"active": "157daa1a9b93f46c",
|
"active": "157daa1a9b93f46c",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
|
"sql语句.md",
|
||||||
|
"代码规范/代码规范.md",
|
||||||
|
"并发.md",
|
||||||
|
"OOP规约.md",
|
||||||
|
"可读性.md",
|
||||||
|
"事务使用.md",
|
||||||
|
"控制语句.md",
|
||||||
|
"API规范.md",
|
||||||
|
"代码组织.md",
|
||||||
|
"工程结构.md",
|
||||||
|
"异常使用.md",
|
||||||
|
"索引使用.md",
|
||||||
|
"日志规范.md",
|
||||||
|
"注释规范.md",
|
||||||
|
"方法规范.md",
|
||||||
|
"命名规范.md",
|
||||||
|
"方法.md",
|
||||||
|
"变量规范.md",
|
||||||
|
"常量规范.md",
|
||||||
|
"常量.md",
|
||||||
|
"logseq-java/pages/变量.md",
|
||||||
|
"Pasted image 20230403123034.png",
|
||||||
|
"代码规范",
|
||||||
|
"Java 并发包中并发队列原理剖析.md",
|
||||||
"203-Java/203.1-Java面试/205.15-Redis/Redis.md",
|
"203-Java/203.1-Java面试/205.15-Redis/Redis.md",
|
||||||
"203-Java/203.1-Java面试/205.15-Redis/Redis设计与实现.md",
|
"203-Java/203.1-Java面试/205.15-Redis/Redis设计与实现.md",
|
||||||
"Java 并发包中并发队列原理剖析.md",
|
|
||||||
"Java 并发包中线程同步器原理剖析.md",
|
"Java 并发包中线程同步器原理剖析.md",
|
||||||
"Java 并发包中并发 List 源码剖析.md",
|
"Java 并发包中并发 List 源码剖析.md",
|
||||||
"Java 并发包中原子操作类原理剖析.md",
|
|
||||||
"Java 并发包中 ThreadLocalRandom 类原理剖析.md",
|
|
||||||
"Java 并发包中 ScheduledThreadPoolExecutor 原理探究.md",
|
|
||||||
"HotSpot算法实现.md",
|
|
||||||
"Error.md",
|
|
||||||
"Exception.md",
|
|
||||||
"CAS.md",
|
|
||||||
"CheckedException.md",
|
|
||||||
"CompletableFuture 组合式异步编程.md",
|
|
||||||
"Brook Pointer.md",
|
|
||||||
"AQS.md",
|
|
||||||
"203-Java/tomcat.md",
|
|
||||||
"203-Java/socket编程.md",
|
|
||||||
"203-Java/Pasted image 20230613181834.png",
|
"203-Java/Pasted image 20230613181834.png",
|
||||||
"203-Java/Java虚拟机.md",
|
|
||||||
"203-Java/Redis/缓存.md",
|
|
||||||
"203-Java/Mybatis/标签的使用.md",
|
|
||||||
"203-Java/203.1-Java面试/205.13-JVM/gc.md",
|
|
||||||
"203-Java/203.1-Java面试/205.19-网络&操作系统/计算机网络.md",
|
|
||||||
"203-Java/203.1-Java面试/JAVA面试-MENU.md",
|
|
||||||
"203-Java/203.1-Java面试/205.19-网络&操作系统/设计模式之禅.md",
|
|
||||||
"203-Java/203.1-Java面试/用流收集数据.md",
|
|
||||||
"203-Java/203.1-Java面试/205.19-网络&操作系统/Pasted image 20230705222905.png",
|
"203-Java/203.1-Java面试/205.19-网络&操作系统/Pasted image 20230705222905.png",
|
||||||
"203-Java/203.1-Java面试/205.19-网络&操作系统/Pasted image 20230708181100.png",
|
"203-Java/203.1-Java面试/205.19-网络&操作系统/Pasted image 20230708181100.png",
|
||||||
"203-Java/203.1-Java面试/205.19-网络&操作系统/Pasted image 20230705223627.png",
|
"203-Java/203.1-Java面试/205.19-网络&操作系统/Pasted image 20230705223627.png",
|
||||||
@@ -196,7 +210,6 @@
|
|||||||
"203-Java/203.1-Java面试/205.14-MySQL",
|
"203-Java/203.1-Java面试/205.14-MySQL",
|
||||||
"203-Java/203.1-Java面试/205.13-JVM",
|
"203-Java/203.1-Java面试/205.13-JVM",
|
||||||
"200-计算机/202-算法",
|
"200-计算机/202-算法",
|
||||||
"203-Java/203.1-Java面试/205.12-多线程",
|
"203-Java/203.1-Java面试/205.12-多线程"
|
||||||
"203-Java/203.1-Java面试/203.11-Java基础"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
4
API规范.md
Normal file
4
API规范.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
api 的出入参必须是结构化的,不能使用 map
|
||||||
|
api 出入参不要有多余的字段,禁止多个接口共用一个大 VO
|
||||||
|
api 都要有 swagger 注解
|
||||||
|
非公开 api 都要有功能权限校验
|
||||||
8
OOP规约.md
Normal file
8
OOP规约.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
所有覆写都要加@Override
|
||||||
|
接口过时必须加@Deprecated 注解,并说明新接口和服务
|
||||||
|
equals 方法,常量或确定有值对象放左边
|
||||||
|
所有整型包装类使用 equals 方法比较
|
||||||
|
禁止使用 BigDecimal(double) 将 double 转换为 BigDecimal 对象,使用字符串可保证准确性
|
||||||
|
所有的 pojo 类属性,rpc 方法的返回值和参数,必须使用包装数据类型
|
||||||
|
构造方法里禁止加入任何业务逻辑,初始化逻辑放在 init 方法中
|
||||||
|
使用 StringBuilder 的 append 方法进行大量字符串拼接
|
||||||
10
sql语句.md
Normal file
10
sql语句.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
小数类型使用 bigdecimal,禁止使用 floag 和 double
|
||||||
|
使用 count (\*)而不是 count (列名)或 count(常量)
|
||||||
|
超过三个表禁止 join
|
||||||
|
分页时,count 为 0 直接返回,避免后面分页语句
|
||||||
|
不得使用外键和级联,一切外键在应用层解决
|
||||||
|
禁止使用存储过程,难以调试和扩展,没有移植性
|
||||||
|
查询和变更涉及多个表需要在列名前加表名
|
||||||
|
in 操作尽量避免,避免不了控制在 1000 内
|
||||||
|
sql 少写逻辑,放到业务层去写
|
||||||
|
mybatis 动态语句避免导致查询全表
|
||||||
4
事务使用.md
Normal file
4
事务使用.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
避免大事务,查询可考虑放在事务外
|
||||||
|
发送异步消息必须在事务结束后
|
||||||
|
仅查询的 service 不要加事务
|
||||||
|
捕获了异常,需要事务回滚,需要手动设置回滚
|
||||||
3
代码组织.md
Normal file
3
代码组织.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
新建 api 是否有必要、所属领域、出入参是否合理
|
||||||
|
类放的 package 是否合理
|
||||||
|
方法放的类是否合理
|
||||||
17
代码规范/代码规范.md
Normal file
17
代码规范/代码规范.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
[[命名规范]]
|
||||||
|
[[常量规范]]
|
||||||
|
[[变量规范]]
|
||||||
|
[[方法规范]]
|
||||||
|
[[注释规范]]
|
||||||
|
[[日志规范]]
|
||||||
|
[[索引使用]]
|
||||||
|
[[异常使用]]
|
||||||
|
[[工程结构]]
|
||||||
|
[[代码组织]]
|
||||||
|
[[API规范]]
|
||||||
|
[[控制语句]]
|
||||||
|
[[事务使用]]
|
||||||
|
[[可读性]]
|
||||||
|
[[OOP规约]]
|
||||||
|
[[并发]]
|
||||||
|
[[sql语句]]
|
||||||
9
变量规范.md
Normal file
9
变量规范.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
Service 中谨慎使用静态变量或成员变量(全局共享,Bean 为单例,并发会存在问题)
|
||||||
|
变量声明与使用不超过 5 行
|
||||||
|
精确计算使用 bigdecimal,不用 float 和 double
|
||||||
|
浮点型数据判断不使用==
|
||||||
|
不要声明过多的变量
|
||||||
|
直接使用 get 方法
|
||||||
|
直接在循环中使用集合元素
|
||||||
|
条件判断直接使用方法返回值
|
||||||
|
返回语句中直接计算结果
|
||||||
5
可读性.md
Normal file
5
可读性.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
使用卫语句,减少if嵌套深度
|
||||||
|
if 条件判断太复杂时,提取变量和方法
|
||||||
|
一个 for 循环只做一件事,两件事用两个 for 循环
|
||||||
|
for 循环中,如果可以,建议封装一个方法
|
||||||
|
方法里的代码保持在同一抽象层级
|
||||||
7
命名规范.md
Normal file
7
命名规范.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
常量命名:全大写,不能直译 **ONE**
|
||||||
|
避免使用否定的布尔变量
|
||||||
|
抽象类命名使用 Abstract 或 Base 结尾,异常类 Exception 结尾
|
||||||
|
杜绝完全不规范的缩写,避免不望文生义
|
||||||
|
避免子类,弗雷变量名相同
|
||||||
|
方法名使用动宾结构
|
||||||
|
集合带上 List 或 s
|
||||||
4
工程结构.md
Normal file
4
工程结构.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
controller 的 api 是给前端调用的,不能被其他方法调用;rpc 方法不能给页面调用
|
||||||
|
微服务间通过引入 spi 包,用 rpc 方法进行本地调用,避免 rest 调用
|
||||||
|
页面接口,rpc 接口,外部接口需要分开入口
|
||||||
|
微服务间避免反向依赖
|
||||||
3
常量规范.md
Normal file
3
常量规范.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
不要使用一个常量类维护所有,要按常量功能归类
|
||||||
|
如果变量值仅在一个固定范围内变化用 enum 类型定义
|
||||||
|
long 和 Long 赋值使用大写 L 结尾
|
||||||
11
并发.md
Normal file
11
并发.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
创建线程命名有意义,方便回溯
|
||||||
|
不通过 Executor 方法创建,使用 ThreadPoolExecutor 方式
|
||||||
|
必须回收自定义的 ThreadLocal 变量,尤其在线程池场景
|
||||||
|
高并发时,同步调用应该去考虑锁的性能损耗
|
||||||
|
能无锁就不要用锁
|
||||||
|
能锁区块就不要锁方法
|
||||||
|
能用对象锁就不要用类锁
|
||||||
|
使用阻塞获取等待锁的方式中,必须在 try 代码块之外,并且在加锁方法与 try 代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在 finally 中无法解锁
|
||||||
|
try 中没有加锁 lock. lock ()就解锁 lock. unlock ()会抛出 IllegalMonitorStateException 异常
|
||||||
|
try 和加锁之间有代码报错,就不会执行 finally 方法报错释放锁
|
||||||
|
分布式锁优先使用 redis 锁,而不是数据库锁
|
||||||
6
异常使用.md
Normal file
6
异常使用.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
不要通过一个空的 catch 块忽略异常
|
||||||
|
finally 不要使用 return、break、continue 非正常结束
|
||||||
|
不要直接抛出 Exception,自己定义业务异常
|
||||||
|
入参 check,使用异常,而不是在 check 方法中返回 result
|
||||||
|
finally 必须对资源对象,流进行关闭,有异常也要 try-catch
|
||||||
|
调用 RPC、二方包、或动态生成类的相关方法时,捕获异常必须使用 Throwable 类进行拦截
|
||||||
4
控制语句.md
Normal file
4
控制语句.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
if/else/for/where/do 中必须要有大括号
|
||||||
|
高并发场景中,禁止使用 == 作为判断条件,使用大于等于或小于等于
|
||||||
|
避免 for 循环中调用数据库或外部 api
|
||||||
|
一个 switch 块中,每个 case 要么通过 continue/break/return 终止,都必须包含一个 default
|
||||||
8
方法规范.md
Normal file
8
方法规范.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
避免方法过长
|
||||||
|
避免嵌套过深
|
||||||
|
使用类名调用静态方法,不要用实例
|
||||||
|
方法参数不宜过多,不超过 5 个
|
||||||
|
返回长度为 0 的数组或容器替代 null
|
||||||
|
尽量有返回值,不传参并对参数设值
|
||||||
|
方法入参,出参不使用 map 和大 VO
|
||||||
|
尽量小的访问范围,不被外部调用用 private,子类访问protected
|
||||||
6
日志规范.md
Normal file
6
日志规范.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
日志使用 slf4j
|
||||||
|
日志输出,字符串和变量使用占位符拼接
|
||||||
|
禁止使用 System.out 和 System.err 输出和e.printStackTrace() 打印异常堆栈
|
||||||
|
异常包含两类信息:案发现场信息和异常堆栈信息,不处理通过 throw 向上抛
|
||||||
|
info、debug 禁止整个对象 json 打印,error 级别打印对象实现 toString 方法,禁止转 json
|
||||||
|
异常信息使用 error 或 warn 级别
|
||||||
8
注释规范.md
Normal file
8
注释规范.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Javadoc 用于每一个 public 或 protected
|
||||||
|
对于方法有参数,返回值,异常,需要在 javadoc 块中描述
|
||||||
|
注释的要求
|
||||||
|
准确反映设计思想和代码逻辑
|
||||||
|
能够描述业务含义,迅速了解代码背后的信息
|
||||||
|
所有类必须添加创建者和日期
|
||||||
|
所有枚举字段必须要有注释,说明每个数据项用途
|
||||||
|
好的命名,结构是自解释的,注释要精简准确、表达到位
|
||||||
Reference in New Issue
Block a user