下面,我有一些返回月份名称的方法。在第一个实现中,我使用switch / case,此方法更长,并且验证位于最后一行。在第二个中,我在第一行中进行验证,而不是使用月份名称声明表而不是switch / case。
当我想到KISS和DRY原理时,哪个更好?
public String getMonthName(int month) {
switch (month) {
case 1:
return "January";
case 2:
return "February";
case 3:
return "March";
case 4:
return "April";
case 5:
return "May";
case 6:
return "June";
case 7:
return "July";
case 8:
return "August";
case 9:
return "September";
case 10:
return "October";
case 11:
return "November";
case 12:
return "December";
default:
throw new IllegalArgumentException("month must be in range 1 to 12");
}
}
也许是这个?
public String getMonthNameNew(int month) {
if ((month < 1) || (month > 12)) throw new IllegalArgumentException("month must be in range 1 to 12");
String[] months = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
return months[month - 1];
}
答案 0 :(得分:1)
我发现第二个更容易阅读。它更短,并且带有前提条件检查,可以立即告诉您允许使用哪些值。在第一个示例中,您必须遍历整个方法主体才能理解这一点。
上述所有方法均应使用java.time.Month
编写为:
public String getMonthNameNew(int month) {
return Month.of(month).getDisplayName(TextStyle.FULL, Locale.ENGLISH);
}
答案 1 :(得分:0)
从理论上来说,两者都可以(我会更喜欢第一个,因为这显示了数字与一行中的字符串的“映射”。选项2要求您了解months[month - 1];
的作用正如评论中所建议的那样,“最直接”的解决方案将围绕一个月enum,并以该月为该枚举的字段命名。
在现实世界中,这两个例子都远远不够。
在这里,您将专注于“不要重复自己”,并查看现有的库类来为您做到这一点。
答案 2 :(得分:0)
在这种情况下,最好列出一份赞成/反对意见。
示例1:
专业版:
骗局
示例2:
专业版:
骗局
没有其他要求,我在这里看不到明显的赢家。
答案 3 :(得分:0)
就像我在评论中说的那样,您可以只做一个枚举类即可。
public enum Months {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
}