减少圈复杂度问题

Ole*_*nyk 2 java sonarqube

我必须解决与大的圈复杂度有关的声纳问题,但仍然没有任何好主意如何做到这一点.

代码由大量的"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;
        }
}
Run Code Online (Sandbox Code Playgroud)

等等..正如你所看到的,我无法用switch case写这个,因为检查了多于1个变量.此外,我无法使用谓词类型的键创建静态映射,因为比较条件动态地来到方法.所以我无法理解如何消除这个'if'运算符.

有什么建议?

编辑

如果将其划分为每种产品类型的方法,那么我将检查何时创建产品类型?我是说我有

ProductType productType = null;
productType = tryParseSoap;
if (Objects.nonNull(productType)) {
    return productType;
}
productType = tryParseString;
if (Objects.nonNull(productType)) {
    return productType
}
Run Code Online (Sandbox Code Playgroud)

如果这样做我仍然有很多if null检查的情况,因为没有他们建议在第一次检查时创建产品然后我会检查很多次,这是一个很大的生产力减少

小智 6

你可以定义一个界面 ProductTypeCreator

public interface ProductTypeCreator {

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

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

}
Run Code Online (Sandbox Code Playgroud)

然后,为每个特定情况创建一个实现.然后,您可以拥有一个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();
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,你可以避免使用ifs.

希望这可以帮助!