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

时间:2009-10-03 11:41:35

标签: java refactoring parameter-object

我有一些代码是相同的,只是某个分配顺序发生在略有不同的顺序。

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

然而,我发现它并不是最清楚的。

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

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

CODE:

原件的三个样本:

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();

        //........
    }

我如何将上述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();

        //........
    }

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

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();

        //........
    }

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

好处是它更具可读性。而不是orderOfSections[0],它可能是orderOfSections.value1SectionIdx ...我还可以将一些验证代码放入类中。

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

编辑:

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

这样的东西

2 个答案:

答案 0 :(得分:6)

我会委托解析输入{{1},而不是传入一个Class或数组,它只是指示原始String中项目的顺序以及它们应该如何分配。这个line。执行以下操作会更具可读性:

Class

最后,这不会有点过分,你会在3个月后回到这段代码并发现它更容易理解。

答案 1 :(得分:1)

恕我直言,最简单,最易读的方法是传递地图而不是int数组。

根据PersonDetails的字段,你甚至可以使用反射并在循环中分配值。