所以我目前正在做一些类的重构。我发现了一个类,它有两种方法。在第一种方法中,它遵循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对象或一个数据对象。
继承不是一个选项,因为它们应该是分开的。
答案 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;这就像引入一个更大的邪恶)。