如何解析树中组织的数据?

时间:2014-07-14 09:46:29

标签: java design-patterns

我正在读取.xml文件并尝试解析数据。目标是简化数据。输入可能看起来像这样(ValueX / ValueY远比简单字符串复杂,例如它可能是对xml文件其他部分的引用):

<node>
    <name>rootNode</name>
    <node>
        <name>Main</name>
        <node>
            <name>Child1</name>
            <valueX>abc</valueX>
            <valueY>def</valueY>
        </node>
    </node>
</node>

我目前的做法如下:

class Parser {
    public SimpleModel parse(Node rootNode) {
        Node mainNode = getMainNode(rootNode);
        ValueX valueX = inspectMainNode(mainNode);

        SimpleModel model = new SimpleModel();
        model.setValueX(valueX);
        return model;
    }

    private ValueX inspectMainNode(Node mainNode) {
        ValueX valueX = /* acquire the value */
        return valueX;
    }
    /* ... */
}

如果还需要ValueY,我应该如何重构此代码? 目前我能想到的最好的事情是这两个解决方案:

1)将模型对象传递给inspect方法,例如private void inspectMainMode(Node mainNode, SimpleModel model);。这样做的缺点是我必须将模型对象传递给许多方法,并且方法返回void =&gt;更难测试。

2)创建两个仅获取ValueX / ValueY的方法,例如private ValueX getValueX(Node mainNode);。缺点:如果方法必须做类似的事情,可能会有代码重复

你有什么建议来解决这个问题?

1 个答案:

答案 0 :(得分:0)

恕我直言,如果唯一改变的是你必须返回2个值(或n> = 2),创建一个包含两个(n)值的类并返回该类的实例:

class Values {
    ValueX valueX;
    ValueY valueY;
    // constructors, setters, getters, equals and hashcode ommitted for brevity ...
}
...
private ValueX inspectMainNode(Node mainNode) {
    ValueX valueX = /* acquire the value */
    ValueY valueY = /* acquire the value */
    return new Values(valueX, valueY);
}
/* ... */

这样,代码的全局结构保持不变,测试方法的设计也是如此。