У меня есть ряд объектов Ruby, которые моделируют базовый XML (например, OXM). К сожалению, XML изменяется, и соответствующая версия подвергается ударам. Мне нужно обновить мои объекты Ruby, чтобы иметь возможность обрабатывать обе версии. Я хотел бы, чтобы в моих методах было что-то более чистое, чем куча предложений if / else, так как это, скорее всего, произойдет снова. Есть ли идиоматический способ Ruby справиться с этим? Я думал об использовании базового класса в качестве прокси для различных «версионных» классов, т.е.
class XMLModel
class V1
# V1 specific implementation
end
class V2;
# V2 specific implementation
end
def initialize
# create a new V? and set up delegation to that specific version of the object
end
def from_xml(xml_string)
# use the XML string to determine correct version and return a
# specific version of the object
end
end
Хорошая вещь в вышеупомянутом методе состоит в том, что каждая версия отличается в коде, и позволяет мне добавлять / удалять версии с небольшим тестированием обратной совместимости. Плохо то, что у меня, скорее всего, будет много дублирования кода. Кроме того, в этом случае XMLModel.new
возвращает новый XMLModel
, а фабричный метод XMLModel.from_xml
возвращает новый XMLModel::V1
.
Идеи