我还有更多其他的 - 如果我没有包括的条件。我怎么能重构这个以减少圈复杂度呢?
if (ONE.equalsIgnoreCase(eachTag.getNodeName()))
{
myclassDto.setOne(formatter
.getElementValueAfterNullCheckWithTrim((Element) eachTag));
}
else if (TWO.equalsIgnoreCase(eachTag.getNodeName()))
{
myclassDto.setTwo(formatter
.getElementValueAfterNullCheckWithTrim((Element) eachTag));
}
else if (THREE.equalsIgnoreCase(eachTag.getNodeName()))
{
myclassDto.setThree(formatter
.getElementValueAfterNullCheckWithTrim((Element) eachTag));
}
else if (FOUR.equalsIgnoreCase(eachTag.getNodeName()))
{
myclassDto.setFour(formatter
.getElementValueAfterNullCheckWithTrim((Element) eachTag));
}
else if (FIVE.equalsIgnoreCase(eachTag.getNodeName()))
{
myclassDto.setFive(formatter
.getElementValueAfterNullCheckWithTrim((Element) eachTag));
}
else if (SIX.equalsIgnoreCase(eachTag.getNodeName()))
{
myclassDto.setSix(formatter
.getElementValueAfterNullCheckWithTrim((Element) eachTag));
}
如何在java中减少此函数的圈复杂度?
您的代码将更容易阅读,而它就像“复杂”(虽然它并不是那么复杂),如果您:
String value = formatter.getElementValueAfterNullCheckWithTrim((Element) eachTag);
String nodeName = eachTag.getNodeName();
switch (nodeName) {
case ONE:
myclassDto.setOne(value);
break;
case TWO:
myclassDto.setTwo(value);
break;
...
}
编辑:您可能想要重构您的DTO,以便更容易使用,例如
myclassDto.setValue(nodeName, value)
我将字符串映射到它们对应的函数。这可以是静态的。
然后你可以循环遍历映射,找到合适的映射(filter
)并应用函数。
private static final Map<String, BiConsumer<MyClassDto, Element>> MAPPING = new HashMap();
static
{
mapping.put(ONE, MyClassDto::setOne);
mapping.put(TWO, MyClassDto::setTwo);
//...
mapping.put(SIX, MyClassDto::setSix);
}
//...
MAPPING.entrySet().stream()
.filter(pair -> pair.getKey().equalsIgnoreCase(eachTag.getNodeName()))
.map(Map.Entry::getValue)
.forEach(func -> func.accept(
myClassDto,
formatter.getElementValueAfterNullCheckWithTrim((Element) eachTag)
));
你可能想要考虑MAPPING
可以包含由equalsIgnoreCase
同等对待的不同密钥的情况(例如“AAA”和“aaa”)。
一种解决方案是使用findFirst().ifPresent()
代替forEach
(由daniu建议)但这可能会掩盖一些错误情况,因此请谨慎使用。