Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 降低圈复杂度问题_Java_Sonarqube - Fatal编程技术网

Java 降低圈复杂度问题

Java 降低圈复杂度问题,java,sonarqube,Java,Sonarqube,我必须解决与大圈复杂度相关的声纳问题,但仍然不知道如何做到这一点 代码由大量的“if”操作符组成,它们是方法中的检查参数,并决定要创建哪个枚举值 下面是一个代码片段,例如: public ProductType createProductType(String val1, String val2, String val3) { if (PRODUCT_MODEL.equals(val1) && PRODUCT_TYPE.equals(val2) {

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

代码由大量的“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编写此代码,因为检查了多个变量。 此外,我无法创建带有谓词类型键的静态映射,因为比较条件是动态地到达方法的。 所以我不明白如何消除这个“如果”操作符

有什么建议吗

编辑

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

ProductType productType = null;
productType = tryParseSoap;
if (Objects.nonNull(productType)) {
    return productType;
}
productType = tryParseString;
if (Objects.nonNull(productType)) {
    return productType
}
如果这样做,我仍然有很多空检查的if情况
因为如果没有他们,我会建议在第一次检查时创建产品,然后我会检查很多次,这会大大降低生产率

你可以定义一个界面,比如说
ProductTypeCreator

public interface ProductTypeCreator {

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

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

}
然后,为每个特定的if情况创建一个实现。 然后,您可以拥有一个列表创建者,并将您的方法重构为类似的内容

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();
}
public ProductType createProductType(字符串val1、字符串val2、字符串val3){
//这应该已经被实例化了
列出创作者名单;
回归创造者
.stream()
.filter(creator->creator.isapplicative(val1、val2、val3))
.map(creator->creator.create(val1、val2、val3))
.findFirst()
.get();
}
这样,您就可以避免ifs


希望这有帮助

在这些方法中创建几个方法并划分if-else可能有三个开关,一个嵌套在另一个内?当然,像这样一个大方法充斥着if/else是不好看的。但是,只要它只将输入参数映射到enum实例,而不映射其他内容,我觉得它可能是解决它所解决问题的足够好的解决方案。阅读和理解是否特别困难?修改it模型的规则是容易还是困难?即使是新加入团队的人?这些问题应该促使决定修改这种方法,而不仅仅是“Sonarqube说这太高了”