下面我有返回月份名称的方法。在第一个实现中,我使用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];
}
我发现第二个更容易阅读。它更短,并有一个前置条件检查,它会立即告诉您允许的值。在第一个示例中,您必须通过整个方法体来理解这一点。
如上所述,该方法应使用java.time.Month
编写为:
public String getMonthNameNew(int month) {
return Month.of(month).getDisplayName(TextStyle.FULL, Locale.ENGLISH);
}
对于一个理论上的例子,两者都会这样做(我会稍微偏好第一个,因为它显示数字在一行内的字符串“映射”。选项2要求你了解months[month - 1];
将为你做什么。正如评论中所建议的那样。 ,“最直接”的解决方案将围绕一个月enum框架,并使该月名称为该枚举的字段。
在现实世界中,这两个例子都不够。
在这里,您将专注于“不要重复自己”,并查看现有的库类来为您完成。
对于这样的情况,最好列出一个赞成/反对的列表。
例1: 优点:
有:
例2: 优点:
有:
没有额外的要求,我在这里看不到明显的赢家。
就像我在评论中所说,你可以做一个枚举类来做。
public enum Months {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
}