[英]How to solve multiple "if return" statements being reported as duplicated code by sonarqube
當有多個 if return 語句時,Sonarqube 報告重復代碼。 例如我有以下代碼:
private static double computeGain(int rangeMax) {
if (rangeMax <= 35) {
return 6.0;
} else if (rangeMax <= 85) {
return 5.0;
} else if (rangeMax <= 170) {
return 4.0;
} else if (rangeMax <= 340) {
return 3.0;
} else if (rangeMax <= 850) {
return 2.0;
} else if (rangeMax <= 1700) {
return 1.0;
} else if (rangeMax <= 3400) {
return 0.5;
} else if (rangeMax <= 8000) {
return 0.25;
}
return 0.0D;
}
我嘗試通過分配給這樣的變量來替換 return gain = 6.0;
,減少退貨次數無濟於事。
刪除所有其他內容,因為它們是多余的,也不起作用。
關於 jfpatenaude 的答案,這是一個很好的解決方案,但最好將范圍和增益保持在一起(結合到一個對象中)而不是將其保存在兩個表中
static private class RangeGainPair {
int range;
double gain;
public RangeGainPair(int range, double gain) {
this.range = range;
this.gain = gain;
}
public int getRange() {
return range;
}
public double getGain() {
return gain;
}
}
private static List<RangeGainPair> rangeGainList = Stream.of(new RangeGainPair(35, 6d),
new RangeGainPair(85, 5d),
new RangeGainPair(170, 4d),
new RangeGainPair(340, 3d),
new RangeGainPair(850, 2d),
new RangeGainPair(1700, 1d),
new RangeGainPair(3400, 0.5d),
new RangeGainPair(8000, 0.25d))
.collect(Collectors.toList());
private static double computeGain(int rangeMax) {
return rangeGainList.stream().filter(rangeGainPair -> rangeMax <= rangeGainPair.range).findFirst()
.map(RangeGainPair::getGain).orElse(0d);
}
在這種情況下,如果您向范圍添加新值,則為增益添加適當的值會更容易(例如,如果您想添加范圍 500 和 2.5 增益,則不需要計算逗號)並且您擁有的條目越多,在 jfpatenaude 答案中執行此操作越困難。
您也可以使用 jfpatenaude 之類的表(例如,因為您不喜歡流或不知道它們,或者使用較低的 java 版本),但只有一個,而不是兩個。
因為它是常數值,出於性能原因,只構建一次列表(或表),所以在 function 之外。
我使用兩個 arrays 清除了 sonarqube 中的代碼異味:
private static double computeGain(int rangeMax) {
int[] thresholds = new int[] { 35, 85, 170, 340, 850, 1700, 3400, 8000 };
double[] gainValues = new double[] { 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.5, 0.25 };
for (int i = 0; i < thresholds.length; i++) {
if (rangeMax <= thresholds[i]) {
return gainValues[i];
}
}
return 0.0D;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.