Skip to content

Instantly share code, notes, and snippets.

@qinyu
Last active December 26, 2023 10:02
Show Gist options
  • Save qinyu/0eec1dcbb657aab73ee1852d8b8db0c2 to your computer and use it in GitHub Desktop.
Save qinyu/0eec1dcbb657aab73ee1852d8b8db0c2 to your computer and use it in GitHub Desktop.
Code Quality Spike
// 业务A
@Transactional
public void doTransactionA(Some some) {
Data data = queryData();
data.some(some);
save(data);
saveLogA(data);
}
//业务B
@Transactional
public void doTransactionB(Some some) {
Data data = queryData();
data.some(some);
save(data);
other(data);
}
// 异步日志存储逻辑
@Async("someThreadPool")
public void saveLogA(Data data) {
kafkaClient.save(data)
}
// 其他异步任务
@Async("someThreadPool")
public void other(Data data){
//otherLogic
}
// 线程池配置
@Bean
ThreadPoolExecutor someThreadPool() {
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
// 业务A
@Transactional
public void doTransactionA(Some some) {
Data data = queryData();
data.some(some);
save(data);
saveLogA(data);
}
// 异步日志存储逻辑
@Async("someThreadPool")
public void saveLogA(Data data) {
kafkaClient.save(data)
}
//业务B
@Transactional
public void doTransactionB(Some some) {
Data data = queryData();
data.some(some);
save(data);
other(data);
}
// 其他异步任务
@Async("someThreadPool")
public void other(Data data){
//otherLogic
}
// 业务A
@Transactional
public void doTransactionA(Some some) {
Data data = queryData();
data.some(some);
save(data);
saveLogA(data);
}
//业务B
@Transactional
public void doTransactionB(Some some) {
Data data = queryData();
data.some(some);
save(data);
other(data);
}
// 异步日志存储逻辑
@Async("someThreadPool")
public void saveLogA(Data data) {
kafkaClient.save(data)
}
/Users/qinyu/PycharmProjects/longi_demo2/venv/bin/python /Users/qinyu/PycharmProjects/longi_demo2/code_quality_spike.py
================================================================================
Issues in code/db_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 事务操作不明确 | 3, 7 | 建议在方法上添加注释说明事务操作的目的和范围 |
| 高 | 事务操作不一致 | 3, 7 | 建议将事务操作放在一个统一的方法中,避免重复代码 |
| 中 | 方法命名不清晰 | 2, 6 | 建议使用更具体的方法名,以表明方法的具体功能 |
| 低 | 变量命名不规范 | 2, 6 | 建议使用驼峰命名法,以提高代码的可读性 |
| 中 | 代码结构不清晰 | 2, 6 | 建议将重复的代码提取为一个单独的方法,以提高代码的可维护性 |
| 中 | 事务操作可能存在隐患 | 7 | 建议在事务操作中添加异常处理,以避免事务失败导致数据不一致 |
| 低 | 缺乏注释 | 2, 6 | 建议添加注释,以便其他开发人员理解代码的意图 |
| 中 | 事务操作可能存在性能问题 | 3, 7 | 建议在事务操作中使用批量处理,以提高性能 |
| 高 | 事务操作可能存在并发问题 | 3, 7 | 建议在事务操作中使用乐观锁或悲观锁,以避免并发问题 |
| 中 | 代码结构不符合设计原则 | 2, 6 | 建议使用面向对象的设计原则,将代码分离为不同的模块,以提高代码的可维护性 |
================================================================================
Issues in code/biz_a_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 未处理异常 | 6 | 在saveLogA方法中,没有对可能出现的异常进行处理,建议使用try-catch语句来捕获异常并进行处理。 |
| 高 | 事务范围过大 | 3 | 在doTransactionA方法中,使用@Transactional注解来标注整个方法,这会导致事务范围过大,建议将事务注解标注在save方法上,以减小事务范围。 |
| 中 | 方法命名不规范 | 2 | doTransactionA方法和saveLogA方法的命名不够清晰,建议使用更具体的命名来表达方法的作用。 |
| 中 | 代码冗余 | 3 | 在doTransactionA方法中,调用了两次save方法,建议将第二次调用的save方法提取出来,放在saveLogA方法中。 |
| 低 | 缺少注释 | 6 | 在doTransactionA方法和saveLogA方法中,缺少注释来解释方法的作用和参数的含义,建议添加注释以提高代码的可读性。 |
| 低 | 异步方法命名不规范 | 7 | saveLogA方法使用了@Async注解,但是方法名并不表明其异步执行的作用,建议将方法名改为saveLogAsync以更清晰地表达其作用。 |
| 低 | 异步方法缺少返回值 | 7 | saveLogA方法没有返回值,但是使用了@Async注解,建议添加一个返回值来表明异步方法的执行结果。 |
================================================================================
Issues in code/thread_pool_code.txt
问题所在的代码行:executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
改进建议:考虑使用更合适的RejectedExecutionHandler,如AbortPolicy或DiscardPolicy,以避免任务被拒绝执行。
================================================================================
Issues in code/all_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 业务A和业务B存在大量重复代码 | 6, 13 | 将重复的代码抽取成公共方法,提高代码复用性 |
| 中 | 业务A和业务B中的事务注解@Transactional重复 | 3, 8 | 将事务注解提取到公共方法中,避免重复注解 |
| 中 | 业务A和业务B中的查询数据操作重复 | 4, 9 | 将查询数据的操作抽取成公共方法,提高代码复用性 |
| 高 | 业务A中的异步日志存储逻辑与业务逻辑混合 | 13 | 将异步日志存储逻辑抽取成独立的方法,避免与业务逻辑耦合 |
| 中 | 业务A中的异步日志存储逻辑可能会影响业务执行效率 | 13 | 考虑将异步日志存储逻辑放在业务执行完成后执行,避免影响业务执行效率 |
| 高 | 线程池配置中的拒绝策略为CallerRunsPolicy,可能会导致线程堆积 | 15 | 考虑使用其他合适的拒绝策略,避免线程堆积问题 |
| 中 | 线程池配置中的线程池名为someThreadPool,命名不够具有描述性 | 15 | 考虑使用更具描述性的线程池名,方便后续维护和排查问题 |
================================================================================
Issues in code/biz_b_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 未指定事务隔离级别 | 3 | 指定事务隔离级别,避免数据并发问题 |
| 高 | 未处理事务回滚 | 6 | 在事务方法中添加try-catch语句,捕获异常后进行事务回滚 |
| 高 | 未处理事务超时 | 3 | 在@Transactional注解中指定事务超时时间,避免长时间事务导致数据库锁定 |
| 中 | 未指定事务传播机制 | 3 | 根据业务需求,指定事务传播机制,避免事务嵌套或事务不生效的问题 |
| 中 | 未对异常进行处理 | 3 | 在事务方法中添加try-catch语句,捕获异常后进行处理或抛出自定义异常 |
| 中 | 异步任务未添加@Async注解 | 10 | 在异步任务方法上添加@Async注解,指定线程池名称 |
| 中 | 异步任务未指定线程池 | 10 | 在@Async注解中指定线程池名称,避免线程池资源耗尽 |
| 低 | 方法命名不规范 | 2, 5 | 建议使用更具有表达性的方法名,如:updateData()、processData()等 |
| 低 | 未对方法参数进行校验 | 4 | 在方法中添加参数校验,避免空指针异常或非法参数问题 |
| 低 | 未添加方法注释 | 2, 5, 6 | 建议添加方法注释,提高代码可读性和维护性 |
================================================================================
Issues in code/transaction_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 中 | 重复代码 | 7, 12 | 抽取重复代码为公共方法 |
| 高 | 事务处理不一致 | 3, 8 | 将@Transactional注解移至业务方法的外层,保证两个业务方法的事务处理一致性 |
| 中 | 未处理异常 | 4, 9 | 在事务方法中添加try-catch块,处理可能出现的异常 |
| 低 | 方法命名不规范 | 3, 8 | 采用更具体的命名,如doTransactionForA和doTransactionForB |
| 中 | 未使用参数 | 2 | 删除无用的参数Some some |
================================================================================
Issues in code/kafka_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 异步方法未使用try-catch捕获异常 | 3 | 建议在异步方法中使用try-catch捕获异常,避免异常导致线程池中的线程终止 |
| 中 | 异步方法未设置超时时间 | 3 | 建议在异步方法中设置超时时间,避免因为网络或其他原因导致异步方法一直阻塞 |
| 低 | 异步方法未添加注释 | 2 | 建议在异步方法上添加注释,说明方法的作用和使用场景 |
| 中 | 异步方法未添加日志记录 | 2 | 建议在异步方法中添加日志记录,方便排查问题和追踪日志 |
| 高 | 异步方法未使用线程池 | 2 | 建议在异步方法中使用线程池,避免因为异步方法过多导致线程资源耗尽 |
| 中 | 异步方法未设置异常处理策略 | 3 | 建议在异步方法中设置异常处理策略,避免异常导致程序崩溃 |
| 高 | 异步方法未使用注解标识 | 1 | 建议在异步方法上使用注解标识,方便其他开发人员理解代码逻辑 |
| 中 | 异步方法未添加参数校验 | 1 | 建议在异步方法中添加参数校验,避免因为参数错误导致异常 |
| 低 | 异步方法命名不规范 | 2 | 建议在异步方法命名时遵循命名规范,使用有意义的方法名 |
| 中 | 异步方法未添加返回值 | 1 | 建议在异步方法中添加返回值,方便调用者获取异步方法的执行结果 |
Process finished with exit code 0
================================================================================
Issues in code/db_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 重复代码 | 6, 11 | 提取重复代码到公共方法中 |
| 高 | 事务操作不一致 | 3, 8 | 考虑将事务操作放在同一个方法中,保证数据的一致性 |
| 中 | 方法命名不清晰 | 2, 7 | 建议使用更具体的方法名,以表明方法的作用 |
| 中 | 未处理异常 | 3, 8 | 建议添加异常处理机制,避免程序崩溃 |
| 低 | 方法过长 | 2, 7 | 建议将方法拆分成更小的方法,提高代码的可读性和可维护性 |
| 低 | 未使用参数 | 4, 9 | 建议删除未使用的参数,避免造成混淆 |
================================================================================
Issues in code/biz_a_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 事务和异步逻辑混合 | 2, 9 | 将异步逻辑移出事务方法,避免事务的回滚影响异步逻辑的执行 |
| 高 | 未处理异常 | 3 | 在事务方法中添加异常处理,避免未处理的异常导致事务回滚 |
| 中 | 方法命名不清晰 | 2, 9 | 建议使用更具体的方法名,如doTransactionWithLogA等 |
| 中 | 未使用参数 | 4 | 可以考虑移除参数,直接在方法内部调用queryData()方法 |
| 低 | 重复保存数据 | 5 | 可以在save方法内部判断数据是否已经存在,避免重复保存 |
| 低 | 异步方法命名不规范 | 9 | 建议使用更具体的方法名,如saveLogToKafka等 |
| 低 | 缺乏注释 | 2, 3, 4, 5, 9 | 建议添加注释,解释方法的作用和参数的含义 |
================================================================================
Issues in code/thread_pool_code.txt
中 | 潜在的线程安全问题 | 4 | 将线程池的RejectedExecutionHandler设置为CallerRunsPolicy可能会导致线程安全问题,建议使用DiscardPolicy或AbortPolicy来处理拒绝执行的任务。
================================================================================
Issues in code/all_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 数据库事务应该在业务层控制,而不是在数据访问层控制 | 2, 8 | 将@Transactional注解移动到业务层方法上,而不是在数据访问层方法上 |
| 高 | 业务A和业务B中存在重复的代码 | 5, 11 | 将重复的代码抽取到一个单独的方法中,然后在业务A和业务B中调用该方法 |
| 中 | 线程池配置中设置了CallerRunsPolicy,可能会导致线程堆积 | 15 | 考虑使用其他的拒绝策略,如AbortPolicy或DiscardPolicy,以避免线程堆积问题 |
| 中 | 异步任务中没有捕获异常,可能会导致任务失败而不被发现 | 20 | 在异步任务中添加异常处理机制,如try-catch语句,以确保异常被捕获并处理 |
| 低 | 异步任务没有设置超时时间,可能会导致任务长时间阻塞 | 20 | 在异步任务中设置超时时间,以避免任务长时间阻塞问题 |
| 低 | 异步任务没有设置线程池大小,可能会导致线程数过多 | 20 | 在异步任务中设置线程池大小,以避免线程数过多问题 |
================================================================================
Issues in code/biz_b_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 事务和异步任务混合使用可能导致数据不一致性 | 3, 8 | 将异步任务移出事务方法,或者将事务方法改为同步执行 |
| 中 | 方法命名不具有清晰的表达意义 | 4, 7 | 建议使用更具描述性的方法名,以提高代码可读性 |
| 中 | 方法内部的逻辑过于复杂 | 5 | 建议将逻辑拆分成更小的方法,以提高代码可读性和可维护性 |
| 低 | 方法参数命名不具有清晰的表达意义 | 3, 4, 7, 8 | 建议使用更具描述性的参数名,以提高代码可读性 |
| 低 | 方法缺乏注释说明 | 3, 4, 7, 8 | 建议添加注释,以提高代码可读性和可维护性 |
| 低 | 方法缺乏异常处理 | 3, 4, 7, 8 | 建议添加异常处理,以提高代码健壮性 |
================================================================================
Issues in code/transaction_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 重复代码 | 6, 11 | 提取公共方法,避免重复代码 |
| 高 | 事务操作不明确 | 2, 7 | 明确指定事务的传播属性,避免可能的事务嵌套 |
| 中 | 事务操作过于复杂 | 2, 7 | 考虑将事务操作拆分为更小的方法,避免事务操作过于复杂 |
| 中 | 事务操作不一致 | 2, 7 | 考虑将事务操作统一为相同的传播属性,避免可能的事务嵌套 |
| 低 | 方法命名不清晰 | 4, 9 | 建议使用更具体的方法名,以表明方法的具体功能 |
| 低 | 未使用参数 | 1, 6 | 考虑删除未使用的参数,避免代码冗余 |
| 低 | 方法过长 | 2, 7 | 考虑将方法拆分为更小的方法,避免方法过长 |
| 低 | 未处理异常 | 2, 7 | 建议使用try-catch语句处理可能出现的异常,避免未处理的异常导致程序崩溃 |
================================================================================
Issues in code/kafka_code.txt
| 严重程度 | 问题 | 问题所在的代码行 | 改进建议 |
| -------- | ---- | -------- | -------- |
| 高 | 缺少日志存储逻辑 | 2 | 建议添加日志存储逻辑,以便追踪和排查问题 |
| 高 | 缺少异常处理 | 3 | 建议添加异常处理,以防止程序崩溃 |
| 中 | 缺少注释 | 3 | 建议添加注释,以便其他开发人员理解代码逻辑 |
| 中 | 缺少日志记录 | 4 | 建议添加日志记录,以便追踪程序运行情况 |
| 低 | 方法命名不规范 | 2 | 建议使用更具描述性的方法名,以提高代码可读性 |
| 低 | 缺少单元测试 | 3 | 建议添加单元测试,以确保代码质量和功能正确性 |
| 低 | 使用异步线程池可能会影响性能 | 2 | 建议评估使用异步线程池的必要性,以避免不必要的性能损耗 |
// 线程池配置
@Bean
ThreadPoolExecutor someThreadPool() {
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
// 业务A
@Transactional
public void doTransactionA(Some some) {
Data data = queryData();
data.some(some);
save(data);
saveLogA(data);
}
//业务B
@Transactional
public void doTransactionB(Some some) {
Data data = queryData();
data.some(some);
save(data);
other(data);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment