【问题标题】:How to reduce boiler plate code in below use case如何在以下用例中减少样板代码
【发布时间】:2021-09-14 12:23:15
【问题描述】:

在以下用例中利用可重用性的最佳解决方案是什么。 每当用户使用以下功能单击按钮时,我都试图清除字符串。 我尝试了很多方法,但没有找到任何可靠的解决方案。

private void clearFields(int i) {
    if (i == 0) {
        boardId = "";
        stateId = "";
        cityId = "";
        schoolId = "";
        classId = "";
        orientationId = "";
        studentTypeId = "";
    } else if (i == 1) {
        stateId = "";
        cityId = "";
        schoolId = "";
        classId = "";
        orientationId = "";
        studentTypeId = "";
    } else if (i == 2) {
        cityId = "";
        schoolId = "";
        classId = "";
        orientationId = "";
        studentTypeId = "";
    } else if (i == 3) {
        schoolId = "";
        classId = "";
        orientationId = "";
        studentTypeId = "";
    } else if (i == 4) {
        classId = "";
        orientationId = "";
        studentTypeId = "";
    } else if (i == 5) {
        orientationId = "";
        studentTypeId = "";
    } else if (i == 6) {
        studentTypeId = "";
    }
}

【问题讨论】:

  • 你可以做内联检查...类似:boardId = (i == 0) ? "" : boardId; stateId = (i == 0) || (i == 1) ? "" : stateId;

标签: java kotlin software-design code-reuse


【解决方案1】:

我假设您确实想通过索引来执行此操作。如果是这样,那么我认为最干净和最简单的方法是使用不间断的开关。还有其他棘手的方法可以做到这一点,但我尽量避免“棘手”。

public class Test {
    
    private void clearFields(final int i) {
        switch (i) {
            case 0:
                boardId = "";
            case 1:
                stateId = "";
            case 2:
                cityId = "";
            case 3:
                schoolId = "";
            case 4:
                classId = "";
            case 5:
                orientationId = "";
            case 6:
                studentTypeId = "";
                break;
            default:
                System.err.println("Invalid index supplied");
        }
    }

    

    private String boardId;
    private String stateId;
    private String cityId;
    private String schoolId;
    private String classId;
    private String orientationId;
    private String studentTypeId;

    public static void main(final String[] args) {
        final Test test = new Test();
        test.setValues();
        test.printValues();
        for(int i = 0; i <= 6; i++) {
            test.clearFields(i);
            test.printValues();
            test.setValues();
        }
    }

    private void setValues() {
        boardId = "boardId";
        stateId = "stateId";
        cityId = "cityId";
        schoolId = "schoolId";
        classId = "classId";
        orientationId = "orientationId";
        studentTypeId = "studentTypeId";
    }

    private void printValues() {
        System.out.println("boardId = " + boardId);
        System.out.println("stateId = " + stateId);
        System.out.println("cityId = " + cityId);
        System.out.println("schoolId = " + schoolId);
        System.out.println("classId = " + classId);
        System.out.println("orientationId = " +orientationId);
        System.out.println("studentTypeId = " + studentTypeId);
        System.out.println();
        System.out.println();
    }
}

[编辑] 我们只有一个孤立的小代码片段可供查看。我觉得我展示的代码是完成您所要求的最简洁的方法。话虽如此,很可能需要重新考虑整个设计,以便您根本不会以这种方式使用索引。说了,我会第一个承认,当一个人有理由确定某个角落不会改变时,有时会在代码的某些角落走捷径。

如果我强烈地认为代码不需要维护,我至少有可能编写您所拥有的精确代码。如果该假设被证明是错误的,我总是可以稍后对其进行重构。这就是为什么我说我假设你真的想做你所要求的。我们无法知道您的要求 - 所以我们无法知道“可维护性”问题会有多大。

除此之外,回过头来重构你自己的代码可能会比我能想到的更多地教给你关于简洁设计的知识......

【讨论】:

    【解决方案2】:

    我会小心减少样板代码。这是个好主意,两个答案都很好。你需要考虑的是(因为你已经用软件设计标签标记了它):

    1. 这是实际代码吗?还是只是例子?如果是后者,您会发现重构代码更难维护
    2. 如果您决定重构它,我更喜欢@Chris Parker 提到的内容,具体来说,“如果是这样,那么我认为最干净和最简单的方法是使用不间断的开关”。但对于以后会处理它的人来说,这将是一场噩梦。在一定程度上避免这种情况的最佳方法是将enum 用于 switch\case。

    【讨论】:

    • 绝对,200% 同意。这就是为什么我以“我假设......”作为我的回答开头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2023-03-18
    • 2019-09-30
    • 2020-06-12
    • 1970-01-01
    相关资源
    最近更新 更多