У меня есть ряд объектов 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
.
Идеи?