哪个实施更好(DRY和KISS)

时间:2019-03-05 14:41:43

标签: java dry design-principles

下面,我有一些返回月份名称的方法。在第一个实现中,我使用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];
}

4 个答案:

答案 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:
专业版:

  • 易于理解
  • 可读

骗局

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

示例2:
专业版:

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

骗局

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

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

答案 3 :(得分:0)

就像我在评论中说的那样,您可以只做一个枚举类即可。

public enum Months {
            "January",
            "February",
            "March",
            "April",
            "May",
            "June",
            "July",
            "August",
            "September",
            "October",
            "November",
            "December"
}