gpt4 book ai didi

java - 减少圈复杂度问题

转载 作者:行者123 更新时间:2023-12-03 23:14:19 30 4
gpt4 key购买 nike

我必须解决与大圈复杂度相关的 Sonar 问题,但仍然不知道如何做到这一点。

该代码由大量的“if”运算符组成,它们是检查方法中的参数并决定要创建哪个枚举值

下面是一个代码片段,例如:

      public ProductType createProductType(String val1, String val2, String val3) {
if (PRODUCT_MODEL.equals(val1) && PRODUCT_TYPE.equals(val2) {
return ProductType.SOAP;
}
if (PRODUCT_MODEL.equals(val1) || val3.equals(SWAP)) {
return ProductType.STRING;
}
}

等等..
如您所见,我无法使用 switch case 编写此代码,因为检查了超过 1 个变量。
我也不能用 Predicate 类型的键创建静态映射,因为比较标准是动态的。
所以我不明白如何消除这个'if'运算符。

有什么建议么?

编辑

如果将其划分为每种产品类型的方法,那么我将检查何时创建产品类型?
我的意思是我有
ProductType productType = null;
productType = tryParseSoap;
if (Objects.nonNull(productType)) {
return productType;
}
productType = tryParseString;
if (Objects.nonNull(productType)) {
return productType
}

如果这样做,我仍然有很多用于空检查的 if 案例
因为没有他们建议在第一次检查时创建的产品,然后我无论如何都会检查它很多次,这会大大降低生产力

最佳答案

你可以定义一个接口(interface),比如 ProductTypeCreator

public interface ProductTypeCreator {

boolean isApplicable(String val1, String val2, String val3);

ProductType create(String val1, String val2, String val3);

}

然后,为每个特定的 if 案例创建一个实现。
然后你可以有一个 List 创建者,并将你的方法重构为类似的东西。
public ProductType createProductType(String val1, String val2, String val3) {
// this should already be instantiated
List<ProductTypeCreator> creators;
return creators
.stream()
.filter(creator -> creator.isApplicable(val1, val2, val3))
.map(creator -> creator.create(val1, val2, val3))
.findFirst()
.get();
}

这样,您可以避免ifs。

希望这可以帮助!

关于java - 减少圈复杂度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52444105/

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