如何解决多个 "if return" 语句被 sonarqube 报告为重复代码的问题

How to solve multiple "if return" statements being reported as duplicated code by sonarqube

Sonarqube 在有多个 if return 语句时报告重复代码。例如我有以下代码:

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,以减少 return 的数量,但无济于事。

删除所有其他内容,因为它们是多余的,也没有用。

我使用两个数组清除了 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;
    }

关于 jfpatenaude 的回答,这是一个很好的解决方案,但最好将范围和增益保持在一起(合并到一个对象)而不是将其保持在两个 tables

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 那样使用 table(例如,因为您不喜欢流或不了解它们,或者使用较低的 java 版本),但是一个,而不是两个。

因为它是常数值,出于性能原因,它只构建列表(或 table)一次,所以在函数之外。