From 432ac9ba4244ad5052c38108438b8e7e33349be8 Mon Sep 17 00:00:00 2001 From: lostecho <752549025@qq.com> Date: Thu, 9 May 2024 22:58:28 +0800 Subject: [PATCH] add code check --- .obsidian/workspace.json | 69 ++++++++++++++++++++++++---------------- API规范.md | 4 +++ OOP规约.md | 8 +++++ sql语句.md | 10 ++++++ 事务使用.md | 4 +++ 代码组织.md | 3 ++ 代码规范/代码规范.md | 17 ++++++++++ 变量规范.md | 9 ++++++ 可读性.md | 5 +++ 命名规范.md | 7 ++++ 工程结构.md | 4 +++ 常量.md | 0 常量规范.md | 3 ++ 并发.md | 11 +++++++ 异常使用.md | 6 ++++ 控制语句.md | 4 +++ 方法.md | 0 方法规范.md | 8 +++++ 日志规范.md | 6 ++++ 注释规范.md | 8 +++++ 索引使用.md | 5 +++ 21 files changed, 163 insertions(+), 28 deletions(-) create mode 100644 API规范.md create mode 100644 OOP规约.md create mode 100644 sql语句.md create mode 100644 事务使用.md create mode 100644 代码组织.md create mode 100644 代码规范/代码规范.md create mode 100644 变量规范.md create mode 100644 可读性.md create mode 100644 命名规范.md create mode 100644 工程结构.md create mode 100644 常量.md create mode 100644 常量规范.md create mode 100644 并发.md create mode 100644 异常使用.md create mode 100644 控制语句.md create mode 100644 方法.md create mode 100644 方法规范.md create mode 100644 日志规范.md create mode 100644 注释规范.md create mode 100644 索引使用.md diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 32c7b00..f1bc94f 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "Java 并发包中并发队列原理剖析.md", + "file": "代码规范/代码规范.md", "mode": "source", "backlinks": true, "source": false @@ -87,7 +87,7 @@ "state": { "type": "backlink", "state": { - "file": "Java 并发包中并发队列原理剖析.md", + "file": "代码规范/代码规范.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -112,7 +112,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "Java 并发包中并发队列原理剖析.md", + "file": "代码规范/代码规范.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -135,7 +135,19 @@ "state": { "type": "outline", "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", "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", - "Java 并发包中并发队列原理剖析.md", "Java 并发包中线程同步器原理剖析.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/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 20230708181100.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.13-JVM", "200-计算机/202-算法", - "203-Java/203.1-Java面试/205.12-多线程", - "203-Java/203.1-Java面试/203.11-Java基础" + "203-Java/203.1-Java面试/205.12-多线程" ] } \ No newline at end of file diff --git a/API规范.md b/API规范.md new file mode 100644 index 0000000..c5e3c10 --- /dev/null +++ b/API规范.md @@ -0,0 +1,4 @@ +api 的出入参必须是结构化的,不能使用 map +api 出入参不要有多余的字段,禁止多个接口共用一个大 VO +api 都要有 swagger 注解 +非公开 api 都要有功能权限校验 \ No newline at end of file diff --git a/OOP规约.md b/OOP规约.md new file mode 100644 index 0000000..b2489f0 --- /dev/null +++ b/OOP规约.md @@ -0,0 +1,8 @@ +所有覆写都要加@Override +接口过时必须加@Deprecated 注解,并说明新接口和服务 +equals 方法,常量或确定有值对象放左边 +所有整型包装类使用 equals 方法比较 +禁止使用 BigDecimal(double) 将 double 转换为 BigDecimal 对象,使用字符串可保证准确性 +所有的 pojo 类属性,rpc 方法的返回值和参数,必须使用包装数据类型 +构造方法里禁止加入任何业务逻辑,初始化逻辑放在 init 方法中 +使用 StringBuilder 的 append 方法进行大量字符串拼接 \ No newline at end of file diff --git a/sql语句.md b/sql语句.md new file mode 100644 index 0000000..6a8abe3 --- /dev/null +++ b/sql语句.md @@ -0,0 +1,10 @@ +小数类型使用 bigdecimal,禁止使用 floag 和 double +使用 count (\*)而不是 count (列名)或 count(常量) +超过三个表禁止 join +分页时,count 为 0 直接返回,避免后面分页语句 +不得使用外键和级联,一切外键在应用层解决 +禁止使用存储过程,难以调试和扩展,没有移植性 +查询和变更涉及多个表需要在列名前加表名 +in 操作尽量避免,避免不了控制在 1000 内 +sql 少写逻辑,放到业务层去写 +mybatis 动态语句避免导致查询全表 \ No newline at end of file diff --git a/事务使用.md b/事务使用.md new file mode 100644 index 0000000..437775c --- /dev/null +++ b/事务使用.md @@ -0,0 +1,4 @@ +避免大事务,查询可考虑放在事务外 +发送异步消息必须在事务结束后 +仅查询的 service 不要加事务 +捕获了异常,需要事务回滚,需要手动设置回滚 \ No newline at end of file diff --git a/代码组织.md b/代码组织.md new file mode 100644 index 0000000..7f35ae3 --- /dev/null +++ b/代码组织.md @@ -0,0 +1,3 @@ +新建 api 是否有必要、所属领域、出入参是否合理 +类放的 package 是否合理 +方法放的类是否合理 diff --git a/代码规范/代码规范.md b/代码规范/代码规范.md new file mode 100644 index 0000000..8df4b9f --- /dev/null +++ b/代码规范/代码规范.md @@ -0,0 +1,17 @@ +[[命名规范]] +[[常量规范]] +[[变量规范]] +[[方法规范]] +[[注释规范]] +[[日志规范]] +[[索引使用]] +[[异常使用]] +[[工程结构]] +[[代码组织]] +[[API规范]] +[[控制语句]] +[[事务使用]] +[[可读性]] +[[OOP规约]] +[[并发]] +[[sql语句]] \ No newline at end of file diff --git a/变量规范.md b/变量规范.md new file mode 100644 index 0000000..557ca65 --- /dev/null +++ b/变量规范.md @@ -0,0 +1,9 @@ +Service 中谨慎使用静态变量或成员变量(全局共享,Bean 为单例,并发会存在问题) +变量声明与使用不超过 5 行 +精确计算使用 bigdecimal,不用 float 和 double +浮点型数据判断不使用== +不要声明过多的变量 + 直接使用 get 方法 + 直接在循环中使用集合元素 + 条件判断直接使用方法返回值 + 返回语句中直接计算结果 \ No newline at end of file diff --git a/可读性.md b/可读性.md new file mode 100644 index 0000000..ea6c4d4 --- /dev/null +++ b/可读性.md @@ -0,0 +1,5 @@ +使用卫语句,减少if嵌套深度 +if 条件判断太复杂时,提取变量和方法 +一个 for 循环只做一件事,两件事用两个 for 循环 +for 循环中,如果可以,建议封装一个方法 +方法里的代码保持在同一抽象层级 \ No newline at end of file diff --git a/命名规范.md b/命名规范.md new file mode 100644 index 0000000..9a0f69a --- /dev/null +++ b/命名规范.md @@ -0,0 +1,7 @@ +常量命名:全大写,不能直译 **ONE** +避免使用否定的布尔变量 +抽象类命名使用 Abstract 或 Base 结尾,异常类 Exception 结尾 +杜绝完全不规范的缩写,避免不望文生义 +避免子类,弗雷变量名相同 +方法名使用动宾结构 +集合带上 List 或 s \ No newline at end of file diff --git a/工程结构.md b/工程结构.md new file mode 100644 index 0000000..63143f6 --- /dev/null +++ b/工程结构.md @@ -0,0 +1,4 @@ +controller 的 api 是给前端调用的,不能被其他方法调用;rpc 方法不能给页面调用 +微服务间通过引入 spi 包,用 rpc 方法进行本地调用,避免 rest 调用 +页面接口,rpc 接口,外部接口需要分开入口 +微服务间避免反向依赖 \ No newline at end of file diff --git a/常量.md b/常量.md new file mode 100644 index 0000000..e69de29 diff --git a/常量规范.md b/常量规范.md new file mode 100644 index 0000000..46f32de --- /dev/null +++ b/常量规范.md @@ -0,0 +1,3 @@ +不要使用一个常量类维护所有,要按常量功能归类 +如果变量值仅在一个固定范围内变化用 enum 类型定义 +long 和 Long 赋值使用大写 L 结尾 \ No newline at end of file diff --git a/并发.md b/并发.md new file mode 100644 index 0000000..24a8411 --- /dev/null +++ b/并发.md @@ -0,0 +1,11 @@ +创建线程命名有意义,方便回溯 +不通过 Executor 方法创建,使用 ThreadPoolExecutor 方式 +必须回收自定义的 ThreadLocal 变量,尤其在线程池场景 +高并发时,同步调用应该去考虑锁的性能损耗 + 能无锁就不要用锁 + 能锁区块就不要锁方法 + 能用对象锁就不要用类锁 +使用阻塞获取等待锁的方式中,必须在 try 代码块之外,并且在加锁方法与 try 代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在 finally 中无法解锁 + try 中没有加锁 lock. lock ()就解锁 lock. unlock ()会抛出 IllegalMonitorStateException 异常 + try 和加锁之间有代码报错,就不会执行 finally 方法报错释放锁 +分布式锁优先使用 redis 锁,而不是数据库锁 \ No newline at end of file diff --git a/异常使用.md b/异常使用.md new file mode 100644 index 0000000..4552e4c --- /dev/null +++ b/异常使用.md @@ -0,0 +1,6 @@ +不要通过一个空的 catch 块忽略异常 +finally 不要使用 return、break、continue 非正常结束 +不要直接抛出 Exception,自己定义业务异常 +入参 check,使用异常,而不是在 check 方法中返回 result +finally 必须对资源对象,流进行关闭,有异常也要 try-catch +调用 RPC、二方包、或动态生成类的相关方法时,捕获异常必须使用 Throwable 类进行拦截 \ No newline at end of file diff --git a/控制语句.md b/控制语句.md new file mode 100644 index 0000000..c305f0f --- /dev/null +++ b/控制语句.md @@ -0,0 +1,4 @@ +if/else/for/where/do 中必须要有大括号 +高并发场景中,禁止使用 == 作为判断条件,使用大于等于或小于等于 +避免 for 循环中调用数据库或外部 api +一个 switch 块中,每个 case 要么通过 continue/break/return 终止,都必须包含一个 default diff --git a/方法.md b/方法.md new file mode 100644 index 0000000..e69de29 diff --git a/方法规范.md b/方法规范.md new file mode 100644 index 0000000..2790804 --- /dev/null +++ b/方法规范.md @@ -0,0 +1,8 @@ +避免方法过长 +避免嵌套过深 +使用类名调用静态方法,不要用实例 +方法参数不宜过多,不超过 5 个 +返回长度为 0 的数组或容器替代 null +尽量有返回值,不传参并对参数设值 +方法入参,出参不使用 map 和大 VO +尽量小的访问范围,不被外部调用用 private,子类访问protected diff --git a/日志规范.md b/日志规范.md new file mode 100644 index 0000000..cdeb34c --- /dev/null +++ b/日志规范.md @@ -0,0 +1,6 @@ +日志使用 slf4j +日志输出,字符串和变量使用占位符拼接 +禁止使用 System.out 和 System.err 输出和e.printStackTrace() 打印异常堆栈 +异常包含两类信息:案发现场信息和异常堆栈信息,不处理通过 throw 向上抛 +info、debug 禁止整个对象 json 打印,error 级别打印对象实现 toString 方法,禁止转 json +异常信息使用 error 或 warn 级别 \ No newline at end of file diff --git a/注释规范.md b/注释规范.md new file mode 100644 index 0000000..c892ddc --- /dev/null +++ b/注释规范.md @@ -0,0 +1,8 @@ +Javadoc 用于每一个 public 或 protected +对于方法有参数,返回值,异常,需要在 javadoc 块中描述 +注释的要求 + 准确反映设计思想和代码逻辑 + 能够描述业务含义,迅速了解代码背后的信息 +所有类必须添加创建者和日期 +所有枚举字段必须要有注释,说明每个数据项用途 +好的命名,结构是自解释的,注释要精简准确、表达到位 \ No newline at end of file diff --git a/索引使用.md b/索引使用.md new file mode 100644 index 0000000..fe197bd --- /dev/null +++ b/索引使用.md @@ -0,0 +1,5 @@ +主键索引 pk_字段名,唯一索引 uk_字段名, 普通索引 idx_字段名 +业务上具有唯一性的字段,即使是组合字段,也必须建成唯一索引 +多表关联查询时,保证被关联字段需要有索引 +varchar 建立索引建议制定长度 +模糊查询禁止全模糊或左模糊 \ No newline at end of file