PMD违规:该方法的圈复杂度为10.有什么替代方案或者可以吗



请提出任何更好的替代方案,或者可以做些什么来改进此代码?

private SubscriptionOption mapSubscriptionOption(final SubscriptionType subscriptionType,
final SubscriptionInfo subscriptionInfo) {
final boolean isSubscriptionLabelFeatureEnabled = featureService.isFeatureEnabled(SUBSCRIPTION_LABEL_FEATURE);
switch (subscriptionType) {
case MOBILE:
return routingMapper.mapMobileSubscriptionOption((MobileSubscriptionInfo) subscriptionInfo, isSubscriptionLabelFeatureEnabled);
case LTE:
return routingMapper.mapLteSubscriptionOption((MobileSubscriptionInfo) subscriptionInfo, isSubscriptionLabelFeatureEnabled);
case DSL:
return routingMapper.mapDslSubscriptionOption((DslSubscriptionInfo) subscriptionInfo);
case EARLY_DSL:
return routingMapper.mapEarlyDslSubscriptionOption((EarlyDslSubscriptionInfo) subscriptionInfo);
case EARLY_MOBILE:
return routingMapper.mapEarlyMobileSubscriptionOption((EarlyMobileSubscriptionInfo) subscriptionInfo);
case HWO:
return routingMapper.mapHwoSubscriptionOption((HwoSubscriptionInfo) subscriptionInfo);
case AOL:
return routingMapper.mapAolSubscriptionOption((AolSubscriptionInfo) subscriptionInfo);
case FMS:
return routingMapper.mapFmsSubscriptionOption((FmsSubscriptionInfo) subscriptionInfo);
default:
throw new IllegalStateException("subscription type not handled: " + subscriptionType);
}
}

代码本身看起来不错。可以做的一件事是使用Map<SubscriptionType, Function<SubscriptionInfo, SubscriptionOption>>,按类型查找函数并执行它:

Map<SubscriptionType, Function<SubscriptionInfo, SubscriptionOption>> mappers = ...;
mappers.put(MOBILE, info -> routingMapper.mapMobileSubscriptionOption((MobileSubscriptionInfo) info, featureService.isFeatureEnabled(SUBSCRIPTION_LABEL_FEATURE)));
mappers.put(DSL, info -> routingMapper.mapDslSubscriptionOption((DslSubscriptionInfo) info));
etc.

然后这样使用:

//note: you might want to do some null checks etc.
return mappers.get(subscriptionType).apply(subscriptionInfo);

不过,这并不一定会使代码更容易阅读,但它可能更灵活,例如,您可以更改它,以便自动拾取新的映射器,或者如果需要,您可以覆盖映射器。

相关内容

最新更新