博主的碎碎念:根据这次重构,对基础规范有了更深的认识。

文章目录


前言

柚子之前在重构项目的时候,参考了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基础知识的改进建议:根据其建议进行相应的修改。


╭◜◝ ͡ ◜◝╮
( ˃̶͈◡˂ ̶͈ )感觉有用的话,欢迎点赞评论呀!
╰◟◞ ͜ ◟◞╯

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐