簡體   English   中英

如何解決 sonarqube 報告為重復代碼的多個“if return”語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM