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