【问题标题】:Which implementation is better (DRY and KISS) [closed]哪个实施更好(DRY 和 KISS)[关闭]
【发布时间】:2019-03-05 14:41:43
【问题描述】:

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

【问题讨论】:

  • Imo,第二个 - 我会朝着限制该方法的回报的方向前进。
  • 您也可以使用Enum 以更少的代码捕获相同的情况
  • @Mike Tung 是完全正确的,而您的第二个每次使用都会创建新的未使用实例,因此效率较低

标签: java dry design-principles


【解决方案1】:

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

上面说的方法应该用java.time.Month写成:

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

【讨论】:

  • 由于在 JDK 中使用了现有的 Month 枚举而被投票
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    对于这样的案例,最好列出利弊。

    示例 1:
    亲:

    • 简单易懂
    • 可读

    缺点:

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

    示例 2:
    亲:

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

    缺点:

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

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

    【讨论】:

      【解决方案4】:

      就像我在 cmets 中所说的,你可以只做一个枚举类来做到这一点。

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

      【讨论】:

        猜你喜欢
        • 2021-09-27
        • 1970-01-01
        • 2011-03-06
        • 2011-02-14
        • 1970-01-01
        • 2021-04-16
        • 2014-07-26
        • 2013-12-15
        • 1970-01-01
        相关资源
        最近更新 更多