为了账号安全,请及时绑定邮箱和手机立即绑定

哪个实施更好(DRY 和 KISS)

哪个实施更好(DRY 和 KISS)

犯罪嫌疑人X 2022-07-20 16:25:41
下面我有返回月份名称的方法。在第一个实现中,我使用 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 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

我发现第二个更容易阅读。它更短,并且带有前置条件检查,可以立即告诉您允许哪些值。在第一个示例中,您必须遍历整个方法体才能理解这一点。


综上所述,该方法应使用以下方式编写java.time.Month:


public String getMonthNameNew(int month) {

  return Month.of(month).getDisplayName(TextStyle.FULL, Locale.ENGLISH);

}


查看完整回答
反对 回复 2022-07-20
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

对于一个理论示例,两者都可以(我更喜欢第一个,因为它显示了数字到一行中的字符串的“映射”。选项 2 要求您了解months[month - 1];将为您做什么。正如评论中所建议的,例如,“最直接”的解决方案将围绕 Month枚举构建,并使该月名称成为该枚举的字段。

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

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


查看完整回答
反对 回复 2022-07-20
?
慕村225694

TA贡献1880条经验 获得超4个赞

就像我在评论中说的那样,你可以做一个枚举类来做到这一点。


public enum Months {

            "January",

            "February",

            "March",

            "April",

            "May",

            "June",

            "July",

            "August",

            "September",

            "October",

            "November",

            "December"

}


查看完整回答
反对 回复 2022-07-20
?
倚天杖

TA贡献1828条经验 获得超3个赞

对于这样的情况,最好列出利弊清单。

示例 1:
专业版:

  • 容易理解

  • 可读

和:

  • 难以扩展(您将如何返回不同语言的月份名称?)。

  • 其他 Java API 使用月份值 0 到 11。

  • 几乎是第二个示例的两倍。

示例 2:
专业版:

  • 袖珍的

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

  • 灵活的

和:

  • 聪明的。代码取决于数据集中没有间隙的事实。虽然在这种情况下确实如此,但在其他情况下可能并不那么明确。

  • 其他 Java API 使用月份值 0 到 11(同上)。

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


查看完整回答
反对 回复 2022-07-20
  • 4 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信