gpt4 book ai didi

java - SonarQube 重构此方法以降低其认知复杂性

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:38:31 26 4
gpt4 key购买 nike

我有以下实用程序方法,我正在使用多个 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;
}

请分享您重构此代码的建议。

最佳答案

我不认为将多个 if 条件合并为一个或简单地清理代码(例如通过更改某些指令的顺序)可以解决您的问题。

您的代码与 single responsibility principle 不匹配.您应该将这个大方法重构为更小的部分。因此,它将可测试,更易于维护和阅读。我花了一些时间做了这个:

public static boolean isWrapperValid(WrapperClass wrapper, boolean isTechnicalToken) {

final WrapperClass unpackedWrapper = unpackWrapper(wrapper);
boolean wrapperValid = isUnpackedWrapperValid(unpackedWrapper);

Key key = null;
try {
key = unpackedWrapper.getKey();
} catch (final Exception exception) {
return wrapperValid;
}

if (key != null) {
if (doesKeyMeetsBasicConditions(key)) {
return wrapperValid;
}
if (doesKeyMeetsValueConditions(key)) {
return true;
}
}
return wrapperValid;
}

protected static WrapperClass unpackWrapper(final WrapperClass wrapper) {
if (wrapper != null && wrapper.length() > 7 && wrapper.substring(0, 6).equalsIgnoreCase("XYZ")) {
return wrapper.substring(7, wrapper.lastIndexOf('.') + 1);
}
return wrapper;
}

protected static boolean isUnpackedWrapperValid(final WrapperClass wrapper) {
return wrapper != null && wrapper.equalsIgnoreCase("TFR");
}

protected static boolean doesKeyMeetsBasicConditions(final Key key) {
Date tokenExpiryTime = key.getExpiresAt();
if (tokenExpiryTime != null) {
return true;
}

String algorithm = key.getAlgorithm();
if (!DESIRED_ALGO.equals(algorithm)) {
return true;
}

String value6 = key.getType();
return !DESIRED_TYPE.equals(value6);
}

protected static boolean doesKeyMeetsValueConditions(final Key key) {
return key.getValue1() != null && key.getValue2().size() > 0
&& key.getValue3() != null && key.getValue4() != null
&& key.getValue5() != null;
}

我不知道领域逻辑,所以我的一些方法有愚蠢的名字等。正如你所看到的,现在你有很多分支不多的小方法(if 条件) - 更易于测试(静态代码并不好,但您可以使用例如 PowerMock 来模拟它)。

关于java - SonarQube 重构此方法以降低其认知复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49752350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com