Я читаю 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);
}
/* ... */
Таким образом, глобальная структура вашего кода остается неизменной, равно как и дизайн ваших методов тестирования.
SimpleModel
предложенного вами класса Values
будет тогда напоминать мой класс SimpleModel
(по крайней мере, для некоторых частей).