博主的碎碎念:根据这次重构,对基础规范有了更深的认识。
文章目录
- 前言
- 一、Sonar常见问题及修改
- (1)Define and throw a dedicated exception instead of using a generic one.
- (2)Return an empty collection instead of null.
- (3)The type of the "al" object should be an interface such as "List" rather than the implementation "ArrayList".
- (4)Immediately return this expression instead of assigning it to the temporary variable "strArr".
- (5)Remove this unused import 'com.sunlord.eoh.vo.ErpOrderListVo'.
- (6)Reduce the total number of break and continue statements in this loop to use at most one.
- (7)Replace the usage of the "instanceof" operator by a catch block.
- (8)Extract this nested try block into a separate method.
- (9)Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.
- (10)Rename this local variable to match the regular expression.
- (11)Make the enclosing method "static" or remove this set.
- (12)Refactor this method to reduce its Cognitive Complexity from 17 to the 15 allowed.
- (13)Use isEmpty() to check whether the collection is empty or not.
- (14)0 is a valid index, but is ignored by this check.
- (15)Extract this nested ternary operation into an independent statement.
- (16)Merge this if statement with the enclosing one.
- (17)Remove useless curly braces around statement (sonar.java.source not set. Assuming 8 or greater.)
- (18)Replace the synchronized class "StringBuffer" by an unsynchronized one such as "StringBuilder".
- (19)Remove this useless assignment to local variable "saleOutDateOrderList"。
- (20)Iterate over the "entrySet" instead of the "keySet".
- (21)1 duplicated blocks of code must be removed.
- (22)Make this anonymous inner class a lambda (sonar.java.source not set. Assuming 8 or greater.)
- (23)Extract this nested try block into a separate method.
- (24)Variable is already assigned to this value.
- (25)Method has 8 parameters, which is greater than 7 authorized.
- 二、问题总结
前言
柚子之前在重构项目的时候,参考了sonar给出的修改意见,下面是对sonar常见问题的一番总结。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Sonar常见问题及修改
(1)Define and throw a dedicated exception instead of using a generic one.
含义:应该抛出明确的异常而不是通用异常。
修改:将抛出的Exception异常改为BaseAppException
(2)Return an empty collection instead of null.
含义:应该返回空集合而不是null。
修改:return null 改为 return new ArrayList<>()
(3)The type of the “al” object should be an interface such as “List” rather than the implementation “ArrayList”.
含义:“al"对象的类型应该是“List”之类的接口,而不是实现"ArrayList”。
修改:将参数类型由ArrayList改为List。
(4)Immediately return this expression instead of assigning it to the temporary variable “strArr”.
含义:立即返回此表达式,而不是将其赋给临时变量"strArr"。
修改:去掉临时变量"strArr",直接返回定义的数据。
(5)Remove this unused import ‘com.sunlord.eoh.vo.ErpOrderListVo’.
含义:去掉无用的引用。
(6)Reduce the total number of break and continue statements in this loop to use at most one.
含义:减少这个循环中break和continue语句的总数,最多使用一个。
修改:去掉不必要的continue语句。
(7)Replace the usage of the “instanceof” operator by a catch block.
含义:用catch块替换"instanceof"操作符的用法。
(8)Extract this nested try block into a separate method.
含义:将这个嵌套的try块提取到一个单独的方法中。
(9)Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.
含义: 添加解释此方法为何为空的嵌套注释,抛出UnsupportedOperationException或完成实现。
修改:在此方法里面加入空注释。
(10)Rename this local variable to match the regular expression.
含义: 重命名此局部变量以匹配正则表达式。
修改:以驼峰命名法重命名此变量
(11)Make the enclosing method “static” or remove this set.
含义:将封闭方法设为“静态”或移除此集合。
修改:将方法改成静态方法或者把静态常量改为非静态常量
(12)Refactor this method to reduce its Cognitive Complexity from 17 to the 15 allowed.
含义: 重构此方法,将其认知复杂性从17降低到允许的15。
修改:重构拆开此方法,降低方法复杂度
(13)Use isEmpty() to check whether the collection is empty or not.
含义:使用isEmpty()检查集合是否为空。
修改:业务实际是非空校验,修改为使用Utils.notEmpty方法
(14)0 is a valid index, but is ignored by this check.
含义:0是一个有效的值,但在这里不能用。一般都是要用特殊的值,比如indexOf应该使用>=0或>-1 (返回结果>0代表匹配成功,否则返回-1)
修改:此处不改,因为需要匹配到首位不是“.”的字符时,进行字符替换。
(15)Extract this nested ternary operation into an independent statement.
含义:将这个嵌套的三元操作提取到一个独立的语句中。
(16)Merge this if statement with the enclosing one.
含义:将此if语句与封闭语句合并。
修改:找到上面的封闭语句,将这个if语句和封闭语句合并写在一起。
(17)Remove useless curly braces around statement (sonar.java.source not set. Assuming 8 or greater.)
含义:删除语句周围无用的大括号(sonar.java.source未设置。假设为8或更大。)
(18)Replace the synchronized class “StringBuffer” by an unsynchronized one such as “StringBuilder”.
含义:将同步类“StringBuffer”替换为非同步类,如“StringBuilder”。
修改:StringBuilder 的方法不是线程安全的(不能同步访问),有速度优势,然而在应用程序要求线程安全的情况下,
则必须使用 StringBuffer 类。此处没有线程与线程之间的交互,可以改成StringBuilder。
(19)Remove this useless assignment to local variable “saleOutDateOrderList”。
含义:删除对局部变量“saleOutDateOrderList”的无效赋值。
(20)Iterate over the “entrySet” instead of the “keySet”.
含义:遍历map时,使用entrySet,而不是keySet;
修改:改为entrySet
原因:调用方法keySetMap.keySet()会生成KeyIterator迭代器,其next方法只返回其key值,而调用entrySetMap.entrySet()方法会生成EntryIterator 迭代器,其next方法返回一个Entry对象的一个实例,其中包含key和value。所以当我们用到key和value时,用entrySet迭代性能更高。
注:keySet方法的迭代器取得key值还要生成对象;而EntryIterator 迭代器直接返回Entry对象的实例
(21)1 duplicated blocks of code must be removed.
含义:1个必须删除重复的代码块。
(22)Make this anonymous inner class a lambda (sonar.java.source not set. Assuming 8 or greater.)
含义:将这个匿名内部类设为lambda(未设置sonar.java.source。假设为8或更大)出现这个警告的原因是因为1.8的jdk可以使用更简单的方式来表达。
修改:不需要 new ,不需要 run 方法,直接写 run 里面的代码,改成() ->这种方式。
(23)Extract this nested try block into a separate method.
含义:将这个嵌套的try块提取到一个单独的方法中。不要在try代码块中再次使用try,去掉内部的try,或者把内部的try代码块抽取到外面。
(24)Variable is already assigned to this value.
含义:接收的参数已经获得了这个值,不需要再写一次 “变量名=”。
(25)Method has 8 parameters, which is greater than 7 authorized.
含义:方法有8个参数,大于7个授权参数。
修改:一种是使用map集合,将参数列表设置到集合里,再将map集合传入方法,匹配出对应的参数进行使用;另外一种是新建对象,将参数设置到对象来传参。
二、问题总结
问题主要存在以下几类:
(1)变量和方法名命名不规范,条件语句不规范:前者按照驼峰命名法进行修改,后者主要出现的是if语句合并问题,将其合并到上一级。
(2)单个方法复杂度太高:对其方法进行拆分,降低复杂度到15。
(3)涉及Java基础知识的改进建议:根据其建议进行相应的修改。
╭◜◝ ͡ ◜◝╮
( ˃̶͈◡˂ ̶͈ )感觉有用的话,欢迎点赞评论呀!
╰◟◞ ͜ ◟◞╯