Intellij hint условие всегда верно - откуда оно знает? - PullRequest
0 голосов
/ 25 ноября 2018

Студентам было дано упражнение для отработки базовых методов разработки программного обеспечения, и я решил сам пройти его, чтобы посмотреть, как оно пойдет.В частности, написание программы, которая преобразует целое число (например, метку времени Unix) в форматированную строку.Практика TDD является частью упражнения, поэтому я сделал это сам.

Другими словами, вместо того, чтобы пытаться элегантно пройти текущий неудачный тест, я стараюсь сделать его как можно более простым и находя возможности рефакторинга по мере их возникновения.

IЯ делаю это в Java 11 с Intellij IDEA.

Это состояние, в котором я сейчас нахожусь. Отметка времени для "1970-03-01 00:00:00" неверно возвращена "1970-02-29 00:00:00 ", поэтому я внес соответствующие коррективы.У меня были похожие проблемы с временными метками на 2 и 3 марта, и наивное исправление - это то, что в коде ниже.

public MyTime(int i) {
    timestamp = i;

    months = (timestamp / (31*86400) % 12) + 1;
    days = (timestamp / 86400 % 31) + 1;
    hours = timestamp / 3600 % 24;
    minutes = timestamp / 60 % 60;
    seconds = timestamp % 60;

    if (months == 2 && days > 28) {
        months = 3;
        if (days == 29) {
            days = 1;
        } else if (days == 30) {
            days = 2;
        } else if (days == 31) {
            days = 3;
        }

    }
}

Очевидный рефактор здесь - days -= 28, который намекает на более общий daysInMonth() на потом ... Все подразделения и вещи по модулю тоже должны работать.

Мой настоящий вопрос касается утверждения else if (days == 31).Intellij предупреждает меня, что это условие всегда верно.Я имею в виду, это так, потому что дни - это (x % 31) + 1, но кажется, что действительно сложная вещь для IDE, чтобы понять.

Кто-нибудь знает, что этоделать под капотом?

1 Ответ

0 голосов
/ 26 ноября 2018

IntelliJ IDEA может выполнять довольно умный анализ потока данных.Если вы не уверены, что эта часть была помечена как всегда true из-за (x % 31) + 1, вы можете увеличить значение с 31 до 32, и предупреждение исчезнет.

Вот блокпост с некоторыми примерами всегда верно и всегда ложно проверка: https://blog.jetbrains.com/idea/2018/01/fumigating-the-idea-ultimate-code-using-dataflow-analysis/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...