Как исправить как найденную 'DD' -аномалию, так и только одну инструкцию возврата - PullRequest
1 голос
/ 23 марта 2020

У меня есть некоторые трудности при исправлении предупреждений 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";
}

Как я могу написать этот код, пожалуйста?

1 Ответ

0 голосов
/ 28 марта 2020

Аномалия «DD» и анализ потока данных говорят о том, что вы присваиваете переменную более одного раза, не используя ее между присваиваниями. Так что все, кроме последнего назначения, не нужны. Обычно это означает, что вы не разделили свой сценарий ios должным образом. В вашем случае у вас есть три сценария ios:

  1. Если ключевое слово не заполнено, возвращаемое значение равно «0».
  2. В противном случае l oop на всех страницах, и если getRank () возвращает ранг, отличный от нуля, тогда это возвращаемое значение.
  3. В противном случае возвращаемое значение равно "totalPage * pageSize - 1 +"

Если вы реализуете эти сценарии ios один за другим вы получаете метод, который не имеет никакого потока данных или других проблем 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;
}

Если вы присмотритесь к для l oop, вы увидите, что page используется только для зацикливания. Он не используется внутри l oop. Это указывает на то, что для l oop, вероятно, нет необходимости. getRank(keyword, pageSize, totalPage) всегда должен возвращать одно и то же значение, поскольку его аргументы никогда не меняются в течение l oop. Так что может быть достаточно позвонить getRank(...) только один раз.

...