方法重构需要去掉多个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;
// ...
}
}
}
注意:如果数字实际上是整数值(例如 ZTA0
和 ZTA000
相同)则
switch (Integer.parseInt(m.group(1))) {
case 0:
// ...
break;
}
下面我有一个老方法。需要重构这个方法
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;
// ...
}
}
}
注意:如果数字实际上是整数值(例如 ZTA0
和 ZTA000
相同)则
switch (Integer.parseInt(m.group(1))) {
case 0:
// ...
break;
}