哪个实施更好(DRY 和 KISS)

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

}


犯罪嫌疑人X
浏览 90回答 4
4回答

肥皂起泡泡

我发现第二个更容易阅读。它更短,并且带有前置条件检查,可以立即告诉您允许哪些值。在第一个示例中,您必须遍历整个方法体才能理解这一点。综上所述,该方法应使用以下方式编写java.time.Month:public String getMonthNameNew(int month) {&nbsp; return Month.of(month).getDisplayName(TextStyle.FULL, Locale.ENGLISH);}

繁花不似锦

对于一个理论示例,两者都可以(我更喜欢第一个,因为它显示了数字到一行中的字符串的“映射”。选项 2 要求您了解months[month - 1];将为您做什么。正如评论中所建议的,例如,“最直接”的解决方案将围绕 Month枚举构建,并使该月名称成为该枚举的字段。在现实世界中,这两个例子都是不够的。在这里,您将专注于“不要重复自己”并查看现有的库类来为您做到这一点。

慕村225694

就像我在评论中说的那样,你可以做一个枚举类来做到这一点。public enum Months {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "January",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "February",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "March",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "April",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "May",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "June",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "July",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "August",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "September",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "October",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "November",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "December"}

倚天杖

对于这样的情况,最好列出利弊清单。示例 1:专业版:容易理解可读和:难以扩展(您将如何返回不同语言的月份名称?)。其他 Java API 使用月份值 0 到 11。几乎是第二个示例的两倍。示例 2:专业版:袖珍的如果稍微更改代码,则可以从不同的源(属性文件、数据库)填充数组。灵活的和:聪明的。代码取决于数据集中没有间隙的事实。虽然在这种情况下确实如此,但在其他情况下可能并不那么明确。其他 Java API 使用月份值 0 到 11(同上)。如果没有额外的要求,我在这里看不到明显的赢家。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java