如何修复发现的 'DD'-异常和只有一个 return 语句
How to fix both Found 'DD'-anomaly and only one return statement
我在修复 PMD 警告时遇到了一些困难,这是我的简化方法:
public String rank(String keyword, int pageSize, int totalPage)
{
String result = "0"; // A: DataflowAnomalyAnalysis: Found 'DD'-anomaly for variable 'result'
if (isNotBlank(keyword))
{
boolean find = false; // B: DataflowAnomalyAnalysis: Found 'DD'-anomaly for variable 'find'
for (int page = 1; page < totalPage; page++)
{
int rank = getRank(keyword, pageSize, totalPage);
if (rank != 0)
{
find = true; // B(1)
result = String.valueOf(rank); // A(1)
break;
}
}
if (!find)
{
result = format("{0}+", totalPage * pageSize - 1); // A(2)
}
}
return result;
}
我试过了,收到了 "OnlyOneReturn" 个警告:
public String rank(String keyword, int pageSize, int totalPage)
{
if (isNotBlank(keyword))
{
for (int page = 1; page < totalPage; page++)
{
int rank = getRank(keyword, pageSize, totalPage);
if (rank != 0)
{
return String.valueOf(rank); // OnlyOneReturn
}
}
return format("{0}+", totalPage * pageSize - 1); // OnlyOneReturn
}
return "0";
}
请问我该如何编写这段代码?
A 'DD'-异常数据流分析告诉您,您多次分配一个变量而没有在分配之间使用它。所以除了最后一个任务之外的所有任务都是不必要的。它通常表明您没有正确分离场景。在您的情况下,您有三种情况:
- 如果关键字为空,则 return 值为“0”。
- 否则遍历所有页面,如果 getRank() return 的排名不是零,那么这是 return 值。
- 否则 return 值为“
totalPage * pageSize - 1
+”
如果你一个一个地实现这些场景,你最终会得到一个没有任何数据流或其他 PMD 问题的方法:
public String rank(String keyword, int pageSize, int totalPage) {
String result;
if (isNotBlank(keyword)) {
result = "0";
} else {
int rank = 0;
for (int page = 1; page < totalPage && rank == 0; page++) {
rank = getRank(keyword, pageSize, totalPage);
}
if (rank != 0) {
result = String.valueOf(rank);
} else {
result = format("{0}+", totalPage * pageSize - 1);
}
}
return result;
}
如果仔细查看 for 循环,您会发现 page
仅用于循环。它不在循环内部使用。这表明可能不需要 for 循环。 getRank(keyword, pageSize, totalPage)
应该总是 return 相同的值,因为它的参数在循环期间永远不会改变。所以只调用 getRank(...)
一次就足够了。
我在修复 PMD 警告时遇到了一些困难,这是我的简化方法:
public String rank(String keyword, int pageSize, int totalPage)
{
String result = "0"; // A: DataflowAnomalyAnalysis: Found 'DD'-anomaly for variable 'result'
if (isNotBlank(keyword))
{
boolean find = false; // B: DataflowAnomalyAnalysis: Found 'DD'-anomaly for variable 'find'
for (int page = 1; page < totalPage; page++)
{
int rank = getRank(keyword, pageSize, totalPage);
if (rank != 0)
{
find = true; // B(1)
result = String.valueOf(rank); // A(1)
break;
}
}
if (!find)
{
result = format("{0}+", totalPage * pageSize - 1); // A(2)
}
}
return result;
}
我试过了,收到了 "OnlyOneReturn" 个警告:
public String rank(String keyword, int pageSize, int totalPage)
{
if (isNotBlank(keyword))
{
for (int page = 1; page < totalPage; page++)
{
int rank = getRank(keyword, pageSize, totalPage);
if (rank != 0)
{
return String.valueOf(rank); // OnlyOneReturn
}
}
return format("{0}+", totalPage * pageSize - 1); // OnlyOneReturn
}
return "0";
}
请问我该如何编写这段代码?
A 'DD'-异常数据流分析告诉您,您多次分配一个变量而没有在分配之间使用它。所以除了最后一个任务之外的所有任务都是不必要的。它通常表明您没有正确分离场景。在您的情况下,您有三种情况:
- 如果关键字为空,则 return 值为“0”。
- 否则遍历所有页面,如果 getRank() return 的排名不是零,那么这是 return 值。
- 否则 return 值为“
totalPage * pageSize - 1
+”
如果你一个一个地实现这些场景,你最终会得到一个没有任何数据流或其他 PMD 问题的方法:
public String rank(String keyword, int pageSize, int totalPage) {
String result;
if (isNotBlank(keyword)) {
result = "0";
} else {
int rank = 0;
for (int page = 1; page < totalPage && rank == 0; page++) {
rank = getRank(keyword, pageSize, totalPage);
}
if (rank != 0) {
result = String.valueOf(rank);
} else {
result = format("{0}+", totalPage * pageSize - 1);
}
}
return result;
}
如果仔细查看 for 循环,您会发现 page
仅用于循环。它不在循环内部使用。这表明可能不需要 for 循环。 getRank(keyword, pageSize, totalPage)
应该总是 return 相同的值,因为它的参数在循环期间永远不会改变。所以只调用 getRank(...)
一次就足够了。