让学生练习了基本的软件开发实践,因此我决定亲自进行一次测试,看看它会如何发展。具体来说,编写将整数(即unix时间戳)转换为格式化字符串的程序。练习TDD是练习的一部分,所以我自己做了。
换句话说,我不是在试图让当前失败的测试通过一个优雅的尝试,而是在尽可能简单地让它通过,并在出现重构时寻找重构的机会。
我正在使用Intellij IDEA在Java 11中进行此操作。
这是我当前所处的状态。“ 1970-03-01 00:00:00”的时间戳错误地返回了“ 1970-02-29 00:00:00”,因此我进行了适当的调整。我在3月2日和3月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似乎认为这是一件 真的 复杂的事情。
有人知道它在做什么吗?
答案 0 :(得分:0)
IntelliJ IDEA可以执行非常聪明的数据流分析。如果由于(x % 31) + 1
不确定此部分是否标记为始终为真,则可以将31递增到32,警告将消失。
此处是带有一些始终为真和始终为假检查的示例的公告:https://blog.jetbrains.com/idea/2018/01/fumigating-the-idea-ultimate-code-using-dataflow-analysis/