【发布时间】:2016-07-21 05:35:30
【问题描述】:
Pmd 告诉我这个方法 (thirdRowsValidation) 的复杂度为 14,但我无法找到减少代码的模式。
indexBookngEnd, indexTravelStart ...所有这些变量都是来自另一个循环迭代中的其他数组的索引(csv文件列的标题) - Ref1
public void thirdRowsValidation(String thirdRowCsv) {
String[] lines1 = thirdRowCsv.split(",");
for (int i = 0; i < lines1.length; i++) {
if (indexBookngEnd == i && "".equals(temporalValidateBookngEnd)) {
temporalValidateBookngEnd = (" to " + lines1[i] + "\n");
}
if (indexBookngStart == i
&& !("".equals(temporalValidateBookngEnd))) {
finalOutput.append("Then it should have booking window ");
indexBookngStart = -1;
}
if (indexTravelEnd == i && "".equals(temporalValidateTravelEnd)) {
temporalValidateTravelEnd = (" to " + lines1[i] + "\n");
}
if (indexTravelStart == i
&& !("".equals(temporalValidateTravelEnd))) {
finalOutput.append("Then it should have travel window ");
String idHeaderColumn = String.format("%1$-" + 5 + "s", "id");
String typeHEaderColumn = String.format("%1$-" + 50 + "s","type");
finalOutput.append("| ");
finalOutput.append(idHeaderColumn);
indexTravelStart = -1;
}
if (indexPackageDescription == i) {
temporalPackages = String.format("%1$-" + 50 + "s", lines1[i]);
}
if (indexPackageCode == i
&& !(lines1[i].matches("[+-]?\\d*(\\.\\d+)?"))
&& indexTravelStart == -1) {
finalOutput.append("| ");
}
}
}
参考1:
public void secondRowValidation(String secondRowCsv) {
String[] lines1 = secondRowCsv.split(",");
for (int i = 0; i < lines1.length; i++) {
if ("Bookng start".equalsIgnoreCase(lines1[i])) {
indexBookngStart = i;
}
if ("Bookng end".equalsIgnoreCase(lines1[i])) {
indexBookngEnd = i;
}
从\n 开始的数组,之后的","
public String getStoryFromCsv(String convert) {
String[] lines = convert.split("(\n)");
for (int j = 0; j < lines.length; j++) {
arrayPerRow = lines[j];
if (j == 0) { // get marketing type and number
firstRowValidation(arrayPerRow);
}
if (j == 1) { // get headers
secondRowValidation(arrayPerRow);
}
if (j > 1) { // get info and append according to headers
thirdRowsValidation(arrayPerRow);
}
}
所以我拥有的是: - 方法 thirdRowsValidation() 的 NPath 复杂度为 649 - 方法“thirdRowsValidation”的圈复杂度为 14。
最后,我收到这样的文字,只是为了让你们有一个想法:
Then it should have booking window 8/8/16 to 10/8/16
Then it should have travel window 11/6/16 to 12/25/16
And it should have online packages:
| id | type |
| 34534 | aaa Pkg |
| D434E | MKW Pkg + asdasdasdasdasdasdas |
| F382K | sds Pkg + Ddding |
| X582F | OYL Pkg + Deluxe Dining |
【问题讨论】:
-
您应该首先将循环的内容提取到单独的方法中。这降低了复杂性。然后,鉴于您似乎有相当多的字段或全局变量,可能会通过将该状态移动到单独的对象中进行一些重构,从而使进一步的重构更容易一些,因为您可以移动该状态对象。但这些只是猜测,所以从你的 IntelliJ 建议开始:-)
-
我明白...这就是我在这里做的例子... if (j == 0) { firstRowValidation(arrayPerRow); } 但正如您所见,需要两个我无法更改的主循环
-
但是您可以将第 4 行到最后但第三行的所有内容移动到一个方法中,这样您的
thirdRowsValidation将只有for循环,然后为其中的每个调用一个方法is. -
我不太明白..你能用代码解释一下 ifs 是怎么回事吗?
标签: java pmd cyclomatic-complexity