Как разобрать данные, организованные в дереве?

1

Я читаю 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); , Недостаток: может быть дублирование кода, если методы должны делать подобные вещи

Что бы вы предложили решить эту проблему?

  • 0
    Почему бы не создать функцию, которая возвращает строку, состоящую из этих двух значений, и использовать для нее функцию split?
  • 0
    @tudoricc Значения не являются строками, это сложные объекты, списки, карты и т. д.
Показать ещё 1 комментарий
Теги:
design-patterns

1 ответ

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);
}
/* ... */

Таким образом, глобальная структура вашего кода остается неизменной, равно как и дизайн ваших методов тестирования.

  • 0
    Мне не нравится идея создания объекта Wrapper с целью возврата более одного значения. Значения не обязательно связаны между собой. SimpleModel предложенного вами класса Values будет тогда напоминать мой класс SimpleModel (по крайней мере, для некоторых частей).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню