如何修复发现的 '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'-异常数据流分析告诉您,您多次分配一个变量而没有在分配之间使用它。所以除了最后一个任务之外的所有任务都是不必要的。它通常表明您没有正确分离场景。在您的情况下,您有三种情况:

  1. 如果关键字为空,则 return 值为“0”。
  2. 否则遍历所有页面,如果 getRank() return 的排名不是零,那么这是 return 值。
  3. 否则 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(...) 一次就足够了。