我有以下实用方法,我正在使用多个 if 语句并遇到认知复杂性问题。我浏览了一些链接,但我无法理解如何在不影响此方法用户的情况下更改代码。
public static boolean isWrapperValid(WrapperClass wrapper, boolean isTechnicalToken){
String key=null;
boolean isValidWrapper = false;
if (wrapper != null && wrapper.length() > 7
&& wrapper.substring(0, 6).equalsIgnoreCase("XYZ"))
{
wrapper= wrapper.substring(7, wrapper.lastIndexOf('.')+1);
}
if(wrapper != null && wrapper.equalsIgnoreCase("TFR")) {
isValidWrapper=Boolean.TRUE;
}
try {
key = wrapper.getKey();
}
catch (Exception exception) {
return isValidWrapper;
}
if(key!=null) {
Date tokenExpiryTime = key.getExpiresAt();
if(tokenExpiryTime!=null) {
return isValidWrapper;
}
String algorithm=key.getAlgorithm();
if(!DESIRED_ALGO.equals(algorithm)) {
return isValidWrapper;
}
String value6=key.getType();
if(!DESIRED_TYPE.equals(value6)) {
return isValidWrapper;
}
if(key.getValue1()!=null && key.getValue2().size()>0 && key.getValue3()!=null && key.getValue4()!=null && key.getValue5()!=null) {
isValidWrapper=Boolean.TRUE;
}
}
return isValidWrapper;
}
请分享您重构此代码的建议。
原文由 smruti ranjan 发布,翻译遵循 CC BY-SA 4.0 许可协议
我不认为将许多
if
条件合并为一个或简单地进行代码清理,例如通过更改某些指令的顺序,可以解决您的问题。你的代码不符合 单一职责原则。您应该将这个大方法重构为更小的部分。因此,它将可测试,更易于维护和阅读。我花了一些时间做了这个:
我不知道领域逻辑,所以我的一些方法有愚蠢的名字等。正如你所看到的,现在你有很多分支不多的小方法(
if
条件) - 更容易测试(静态代码不好,但您可以使用例如 PowerMock 来模拟它)。