这个代码(被破坏的)被PMD标记为嵌套太深。我个人总是用我编写的任何语言编写代码 - 尤其是大型数据库驱动的for循环。
这种编码风格真的很不受欢迎吗?我发现它是最易于维护和最干净的。
for (MyList MyRegistry : listJSP) {
if (meta.containsKey(MyRegistry.getFieldName()) && MyRegistry.getOrderType().equals(orderType)) {
String CustomerInput = meta.get(MyRegistry.getFieldName())[0];
String jspFieldName = MyRegistry.getFieldName();
if (MyRegistry.getErrorsCheck()) {
mapErrors = valUtil.adTextContainsErrors(CustomerInput, cms.getRegex("VALIDATION"));
if (mapErrors.containsKey(Boolean.TRUE)) {
mapValidationErrors.put(jspFieldName, mapErrors.get(Boolean.parseBoolean("true")));
log.info("Errors " + "{}: ", CustomerInput);
}
}
List<JSPFieldValidation> jSPFieldValidation = cms.getJSPFieldValidations(orderType, MyRegistry.getFieldName());
for (JSPFieldValidation jspf : jSPFieldValidation) {
String valRule = jspf.getValidationRule();
if (valRule.equals("REQUIRED")) {
if (isEmpty(CustomerInput)) {
mapValidationErrors.put(orderType, orderType);
log.info(CustomerInput + "{}: ", valRule);
}
}
else {
Pattern p = cms.getRegex(valRule);
if (p != null) {
if (!isValid(CustomerInput, p)) {
mapValidationErrors.put(orderType, orderType);
log.info(CustomerInput + "{}", valRule);
}
}
}
}
}
}
答案 0 :(得分:4)
静态分析工具基于普遍接受的(或可配置的)标准提供主观建议。
因此,如果您的循环嵌套太深,那么没有人能够给出正确的答案。
如果您不喜欢PMD给出的建议,我建议您以不同的方式配置PMD,以便它不运行该规则或使用不同的参数运行它。
话虽如此,将一些逻辑提取到更小的方法中也是微不足道的。
答案 1 :(得分:2)
当你有嵌套循环和许多ifs时,方法的Cyclomatic Complexity会增加。它基本上表明了测试的难度。
将您的方法拆分为较小的方法,或者如果您对代码看起来不错,则可以忽略它。