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