重构冗余的if语句

时间:2016-03-09 19:38:40

标签: java refactoring

所以我目前正在做一些类的重构。我发现了一个类,它有两种方法。在第一种方法中,它遵循if-Statement:

if(sapData.getTime > 100 || sapData.getUserName != null && sapData.getBusinessValue > 0)

(请记住,我有点轻松一点。)

在我的第二种方法中:

if(data.getTime > 100 || data.getNameOfUser != null && data.getBValue > 0)

正如您所看到的,if语句背后的逻辑完全相同。但是sapData和数据是不同的对象,而Methods(实际上只是getter)具有不同的名称。

我现在要做的是编写一个方法isValid,我可以在其中传递一个SapData对象或一个数据对象。

继承不是一个选项,因为它们应该是分开的。

5 个答案:

答案 0 :(得分:4)

如果你正在使用较新版本的Java,那么将getters方法传递给isValid并为特定类重载此方法可能是合适的:

public static <T> boolean isValid(T data,
        Function<? super T, Integer> timeGetter,
        Function<? super T, String> usernameGetter,
        Function<? super T, Integer> businessValueGetter) {
    return (timeGetter.apply(data) > 100 || usernameGetter.apply(data) != null && businessValuesGetter.apply(data) > 0);
    // or something more complex
}

public static boolean isValid(Data data) {
    return isValid(data, Data::getTime, Data::getUserName, Data::getBusinessValue);
}

public static boolean isValid(SapData data) {
    return isValid(data, SapData::getTime, SapData::getUserName, SapData::getBusinessValue);
}

答案 1 :(得分:1)

您可以在班级使用谓词..? (https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html

编辑:您可能需要这两种类型的接口,但这应该不是问题...

答案 2 :(得分:1)

如果你不能使用继承,你可以使用类似的东西:

boolean isValid(Object myData) {
    boolean valid = false;

    if (myData instanceof SapData) {
        SapData sData = (SapData) myData;
        if (sData.getTime() > 100 || sData.getNameOfUser() != null) {
            valid = sData.getBusinessValue() > 0;
        }
    }
    if (myData instanceof OtherData) {
        OtherData oData = (OtherData) myData;
        if (oData.getTime() > 100 || oData.getNameOfUser() != null) {
            valid = oData.getBValue() > 0;
        }
    }
    return valid;
}

这最终会比您的示例更多的代码,但如果条件更复杂,或者有许多不同类型的Data,它可能是有意义的。

答案 3 :(得分:0)

如果继承不是一个选项,那么你没有太多的选择。您可以考虑增加代码的可读性,而不是将条件重构到中心位置。

你可以做的一件事是,在那些实现条件的类(SapData和数据)中创建一个新函数,并给出一个有意义的名称(我不知道上下文,所以我不能给你一个但是让我们说函数的名称为“isValid()”,而代码变为if(sapData.isValid()),后者的可读性更高。

此外,如果你可以断言,你可以创建两个函数来返回谓词并评估if条件中的谓词。这样,您可以在域类中移动核心条件,同时提高代码的可读性。

答案 4 :(得分:0)

在尝试重构时,我们应该避免过度工程,这对我来说就是这种情况。即使一个人想要重构,我们也不应该产生一个更大的邪恶来重构一个更小的邪恶(例如,使用&#39;类型检查&#39;这就像引入一个更大的邪恶)。