帮助重构:介绍参数对象?

Ale*_*sky 0 java refactoring parameter-object

我有一些代码是相同的,除了一定的分配顺序发生在略有不同的顺序.

很容易将其分解为类型的方法参数int[],它表示顺序.

但是,我发现它并不是最清楚的.

另一种选择是将它们分解为类型的对象AssignmentOrders.我也可以对对象构造函数中的值进行验证,而这些值是我无法对数组进行的.这将是从书,"引入参数对象"重构重构.

我想知道这种特殊的重构是否过度,我应该坚持下去int[]

码:

原件的三个样本:

private static PersonDetails parseLine(String line, String deliminator, int[] orderOfSections) 
            throws Exception {
        String[] sections = line.split(deliminator);

        String value1 = sections[0].trim();
        String value2 = sections[1].trim();
        String value3 = sections[4].trim();
        String value4 = sections[2].trim();
        String value5 = sections[3].trim();

        //........
    }

private static PersonDetails parseLine(String line, String deliminator) 
            throws Exception {
        String[] sections = line.split(deliminator);

        String value1 = sections[1].trim();
        String value2 = sections[0].trim();
        String value3 = sections[2].trim();
        String value4 = sections[3].trim();
        String value5 = sections[4].trim();

        //........
    }

private static PersonDetails parseLine(String line, String deliminator, int[] orderOfSections)


        throws Exception {
        String[] sections = line.split(deliminator);

        String value1 = sections[0].trim();
        String value2 = sections[1].trim();
        String value3 = sections[2].trim();
        String value4 = sections[4].trim();
        String value5 = sections[5].trim();

        //........
    }
Run Code Online (Sandbox Code Playgroud)

我如何将上面的3重构为:

private static PersonDetails parseLine(String line, String deliminator, int[] orderOfSections) 
            throws Exception {
        String[] sections = line.split(deliminator);

        String value1 = sections[orderOfSections[0]].trim();
        String value2 = sections[orderOfSections[1]].trim();
        String value3 = sections[orderOfSections[2]].trim();
        String value4 = sections[orderOfSections[3]].trim();
        String value5 = sections[orderOfSections[4]].trim();

        //........
    }
Run Code Online (Sandbox Code Playgroud)

理论上我如何将它重构为参数对象:

private static PersonDetails parseLine(String line, String deliminator, OrderOfSections order) 
        throws Exception {
        String[] sections = line.split(deliminator);

        String value1 = sections[order.getValue1Idx].trim();
        String value2 = sections[order.getValue2Idx].trim();
        String value3 = sections[order.getValue3Idx].trim();
        String value4 = sections[order.getValue4Idx].trim();
        String value5 = sections[order.getValue5Idx].trim();

        //........
    }
Run Code Online (Sandbox Code Playgroud)

我想要做的是创建一个特定的类而不是使用int[]...但是想知道这是否有点过分.

好处是它更具可读性.而不是orderOfSections[0],它可能是orderOfSections.value1SectionIdx...我也可以在课堂上放置一些验证码.

我相信这就是Martin Fowler所说的引入参数对象.

编辑:

另一种选择是使用词典.比新课程更轻,但更具描述性...然后我可以使用类似的东西orderOfSections["value1"]

akf*_*akf 6

我将委托解析输入,而不是传入一个Class简单地指示原始项目的顺序String以及如何分配它们的数组或数组.执行以下操作会更具可读性:lineClass

private static PersonDetails parseLine(String line, String deliminator, 
                         SectionsReader reader) throws Exception 
{
    reader.setLine(line);
    String value1 = reader.getValue1();
    String value2 = reader.getValue2();
    String value3 = reader.getValue3();
    String value4 = reader.getValue4();
    String value5 = reader.getValue5();

    //........
}
Run Code Online (Sandbox Code Playgroud)

最后,这不会有点矫枉过正,当你回到这段代码并发现它更易于理解时,你会感谢3个月后的自己.