我必须解决与大的圈复杂度有关的声纳问题,但仍然没有任何好主意如何做到这一点.
代码由大量的"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.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |