IntelliJ报告代码重复不是吗?

时间:2016-09-26 12:06:54

标签: java intellij-idea

IntelliJ报告了代码重复警告,即使我认为它不是真正的重复。我在谷歌上找不到任何关于它的东西,所以我想知道我做错了什么。

例如:

private static float[] getMatrix() {
    switch (matrixMode) {
        case PROJECTION:
            return projectionMatrix;
        case VIEW:
            return viewMatrix;
        case MODEL:
            return modelMatrix;
        default:
            throw new Error("Unknown matrix mode " + matrixMode);
    }
}

private static Stack<float[]> getStack() {
    switch (matrixMode) {
        case PROJECTION:
            return projectionStack;
        case VIEW:
            return viewStack;
        case MODEL:
            return modelStack;
        default:
            throw new Error("Unknown matrix mode " + matrixMode);
    }
}

这是一个代码重复报告,我不明白为什么。 嗯,它确实看起来很相似,但绝不是重复。

用法也大不相同。 我用它去除每个方法中的实际代码重复,它使用基于矩阵模式的矩阵,例如:

public static void push() {
    switch (matrixMode) {
        case PROJECTION:
            projectionStack.push(projectionMatrix.clone());
            break;
        case VIEW:
            viewStack.push(viewMatrix.clone());
            break;
        case MODEL:
            modelStack.push(modelMatrix.clone());
            break;
    }
}

public static void pop() {
    switch (matrixMode) {
        case PROJECTION:
            projectionMatrix = projectionStack.pop();
            break;
        case VIEW:
            viewMatrix = viewStack.pop();
            break;
        case MODEL:
            modelMatrix = modelStack.pop();
            break;
    }
}

这样的代码现在可以很好地替换为:

public static void push() {
    getStack().push(getMatrix().clone());
}

public static void pop() {
    // setMatrix() also is a helper method of the same style, but does not produce a duplicate warning
    setMatrix(getStack().pop());
}

因为我有点扯掉OpenGL(尽管OpenGL可能有这样做的原因,而我只是因为OpenGL而这样做),这意味着,有很多方法可以通过引入两个getMatrix()和getStack()(以及setMatrix()),删除了大量实际的代码重复,IntelliJ不会报告这样做。

我看不出如何使用不同的返回类型来概括两个方法。 那我的编程怎么样坏了,我该怎么办?或者IntelliJ是愚蠢的?

我认为代码重复功能非常好,所以我不想压制警告,但有时似乎弄错了。

0 个答案:

没有答案