我正在读取.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)将模型对象传递给检查方法,例如private void inspectMainMode(Node mainNode, SimpleModel model);。缺点是我必须将模型对象传递给许多方法,并且这些方法返回void =>更难测试。

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

您会提出什么解决方案?

最佳答案

恕我直言,如果唯一改变的是您必须返回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);
}
/* ... */


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

关于java - 如何解析树状组织的数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24733695/

10-10 07:26