代码之家  ›  专栏  ›  技术社区  ›  Oleksandr Riznyk

降低圈复杂度问题

  •  2
  • Oleksandr Riznyk  · 技术社区  · 6 年前

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

    代码由大量的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
    }
    

    如果这样做,我仍然有很多如果空检查的情况

    1 回复  |  直到 6 年前
        1
  •  6
  •   user10367961 user10367961    6 年前

    你可以定义一个接口,比如 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();
    }
    

    这样,你就可以避开国际单项体育联合会。