减少圈复杂度,多个if语句java

问题描述 投票:1回答:2

我还有更多其他的 - 如果我没有包括的条件。我怎么能重构这个以减少圈复杂度呢?

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中减少此函数的圈复杂度?

java complexity-theory reduce
2个回答
2
投票

您的代码将更容易阅读,而它就像“复杂”(虽然它并不是那么复杂),如果您:

  • 使用switch语句
  • 事先提取getNodeName()的值
  • 事先提取getElementValueAfterNullCheckWithTrim()返回的值 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)

1
投票

我将字符串映射到它们对应的函数。这可以是静态的。

然后你可以循环遍历映射,找到合适的映射(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建议)但这可能会掩盖一些错误情况,因此请谨慎使用。

© www.soinside.com 2019 - 2024. All rights reserved.