目的
主要记录一下遇到的代码质量问题(主要通过Sonar Plugin)
简介
笔记(二)记录代码质量检测工具检测到的问题
质量问题汇总(持续更新)
“Random” objects should be reused
不合规写法
private String getOuterTitleImageURL() {
Random random = new Random();
int num = random.nextInt(outerImageCount);
return outerUrl + num + "." + outerImageType;
}
意思:random 这个实例应该被重用,而不是每次方法调用的时候再去 new 创建实例
理由:可以减少内存开销,其次是有的 JDK 实现的随机数的算法是基于 seed,如果每次重新 new 一个实例相当于更新了 seed,破坏了随机性
解决方法
可以用 SecureRandom.getInstanceStrong()创建类成员变量
合规写法
public class ArticleMapper {
private final Random RANDOM = SecureRandom.getInstanceStrong();
private String getOuterTitleImageURL() {
int num = RANDOM.nextInt(outerImageCount);
return outerUrl + num + "." + outerImageType;
}
}
“await” should not be used redundantly
不合规写法
const getArticleList_ = async (): Promise<Article> => {
return await getArticleList(request);
};
意思:async 的方法的返回值不用再用 await 获取
理由:async 修饰的方法返回值已经是 Promise 类型了,再用 awiat 相当于获取到 getArticleList(request)方法的返回值 article 然后再将这个返回值 article 包装成 Promise 类型; 这样显得多余,因为如果直接 return getArticleList(request), 最终得到的也是 Promise 类型
解决方法
删除多余的"await"
合规写法
const getArticleList_ = async (): Promise<Article> => {
return getArticleList(request);
};
Array-mutating methods should not be used misleadingly
不合规写法
Object.assign(
articleList,
response.articleList.sort(articleSortComparator).map(toViewArticle)
);
意思:javascript 中 Array 的一些方法是会改变原数组的
var b = a.reverse(); // 不合规
var d = c.sort(); // 不合规
理由:造成源数据可变,提高了造成排查问题的难度
解决方法
通常做法是浅拷贝一份原始对象;javascript 中通常用展开运算符
"…"进行浅拷贝
var b = [...a].reverse(); // 浅拷贝一份a
b.sort(); // 更改拷贝的b数组不影响原本的a
合规写法
Object.assign(
articleList,
[...response.articleList].sort(articleSortComparator).map(toViewArticle)
);