方法重构需要去掉多个if条件

Method refactor need to remove multiple if conditions

下面我有一个老方法。需要重构这个方法

private Scheme <Method Name>(Input input, <classname extends HashTable> elementCollection, Map<String, Object> loadValue, String imt) {
        Scheme scheme = null;

        if (input.isInfo()) {
            if (elementCollection.containsKey("ZTA216")) {
                <Some Logic>
            } else if (imt.equals("4124")) {
               <Some Logic>
            }
        }
        if (elementCollection.containsKey("ZTA001")) {
            try {
               <Some Logic>
            } catch (Exception e) {
                scheme = null;
            }
        }
        if (elementCollection.containsKey("ZTA000")) {
           <Some Logic>
        }

        if (elementCollection.containsKey("ZTA201")) {
            <Some Logic>
        }
        if (elementCollection.containsKey("ZTA211")) {
           <Some Logic>
        }
        if (elementCollection.containsKey("ZTA210")) {
           <Some Logic>
        }
        String acquirer_id = null;
        if (elementCollection.containsKey("ZTA032")) {
            <Some Logic>
        }
        if (scheme != null) {
            <Some Logic>
        }
        if (elementCollection.containsKey("ZTA204")) {
            <Some Logic>
        }
        

        if (elementCollection.containsKey("ZTA217")) {
            <Some Logic>
        }
        if (elementCollection.containsKey("ZTA218") && !(imt.equals("1120") || imt.equals("1420") || imt.equals("1220"))) {
           <Some Logic>
        }
        if (elementCollection.containsKey("ZTA219")) {
           <Some Logic>
        }
        if (elementCollection.containsKey("ZTA220")) {
            <Some Logic>
        }
        if (elementCollection.containsKey("ZTA221")) {
            <Some Logic>
        }
        if (elementCollection.containsKey("ZTA222")) {
           <Some Logic>
        }
        if (elementCollection.containsKey("ZTA224")) {
          <Some Logic>
        }
        if (elementCollection.containsKey("ZTA225")) {
           <Some Logic>
        }
        if (elementCollection.containsKey("ZTA223")) {
            try {
               <Some Logic>
            } catch (NumberFormatException e) {
                log.warn("Error Mesage", elementCollection.get("ZTA223").getStringValue());
            }
        }

我必须重构这个方法。因为声纳提出了“认知复杂性”的问题。我试图替换 'switch' 语句中的所有“if”。但是在每个 if 条件检查中 'containskey'。所以我不确定这是否是一个好方法。

任何解决方案都会更有帮助,谢谢。

我怀疑如果您将 Pattern 编译成 grok 为您输入,您会发现这更容易。例如,如果您匹配“ZTA”并将数字分组会怎样。然后循环使用它。喜欢,

Pattern p = Pattern.compile("ZTA(\d+)");
for (String key : elementCollection.keySet()) {
    Matcher m = p.matcher(key);
    if (m.matches()) {
        switch (m.group(1)) {
        case "000":
            // Some logic
            break;
        case "001":
            // Some logic
            break;
        case "032":
            // Some logic
            break;
        // ...
        }
    }
}

注意:如果数字实际上是整数值(例如 ZTA0ZTA000 相同)则

switch (Integer.parseInt(m.group(1))) {
case 0:
    // ...
    break;
}