Last active
December 26, 2023 10:02
-
-
Save qinyu/0eec1dcbb657aab73ee1852d8b8db0c2 to your computer and use it in GitHub Desktop.
Code Quality Spike
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 业务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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 业务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) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//业务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 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 业务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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 异步日志存储逻辑 | |
@Async("someThreadPool") | |
public void saveLogA(Data data) { | |
kafkaClient.save(data) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
================================================================================ | |
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 | 建议评估使用异步线程池的必要性,以避免不必要的性能损耗 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 线程池配置 | |
@Bean | |
ThreadPoolExecutor someThreadPool() { | |
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); | |
return executor; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 业务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