哪种实施更好(DRY和KISS)[关闭]

问题描述 投票:1回答:4

下面我有返回月份名称的方法。在第一个实现中,我使用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 dry design-principles
4个回答
1
投票

我发现第二个更容易阅读。它更短,并有一个前置条件检查,它会立即告诉您允许的值。在第一个示例中,您必须通过整个方法体来理解这一点。

如上所述,该方法应使用java.time.Month编写为:

public String getMonthNameNew(int month) {
  return Month.of(month).getDisplayName(TextStyle.FULL, Locale.ENGLISH);
}

0
投票

对于一个理论上的例子,两者都会这样做(我会稍微偏好第一个,因为它显示数字在一行内的字符串“映射”。选项2要求你了解months[month - 1];将为你做什么。正如评论中所建议的那样。 ,“最直接”的解决方案将围绕一个月enum框架,并使该月名称为该枚举的字段。

在现实世界中,这两个例子都不够。

在这里,您将专注于“不要重复自己”,并查看现有的库类来为您完成。


0
投票

对于这样的情况,最好列出一个赞成/反对的列表。

例1: 优点:

  • 容易明白
  • 可读

有:

  • 难以扩展(您如何以不同语言返回月份名称?)。
  • 其他Java API使用月份值0到11。
  • 几乎是第二个例子的两倍。

例2: 优点:

  • 紧凑
  • 如果稍微更改代码,则可以从不同的源(属性文件,数据库)填充数组。
  • 灵活

有:

  • 聪明。代码取决于数据集中没有间隙的事实。虽然在这种情况下这是正确的,但在其他情况下可能并不那么明确。
  • 其他Java API使用月份值0到11(与上面相同)。

没有额外的要求,我在这里看不到明显的赢家。


0
投票

就像我在评论中所说,你可以做一个枚举类来做。

public enum Months {
            "January",
            "February",
            "March",
            "April",
            "May",
            "June",
            "July",
            "August",
            "September",
            "October",
            "November",
            "December"
}
© www.soinside.com 2019 - 2024. All rights reserved.