Студентам было дано упражнение для отработки базовых методов разработки программного обеспечения, и я решил сам пройти его, чтобы посмотреть, как оно пойдет.В частности, написание программы, которая преобразует целое число (например, метку времени 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, чтобы понять.
Кто-нибудь знает, что этоделать под капотом?