Tengo una serie de objetos Ruby que modelan XML subyacente (como un OXM). Lamentablemente, el XML se está modificando y la versión correspondiente se está ejecutando. Necesito actualizar mis objetos de Ruby para poder manejar ambas versiones. Me gustaría algo más limpio que una tonelada de cláusulas if/else en mis métodos, ya que es probable que esto vuelva a ocurrir. ¿Hay una forma idiomática de Ruby para manejar esto? Estaba pensando en el uso de la clase base como un proxy para varios "versionado" clases, es decirControl de versiones de un objeto 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
Lo bueno del método anterior es que cada versión es distinta dentro del código, y lo que me permite de inserción/extracción versiones con poca prueba de compatibilidad hacia atrás. Lo malo es que probablemente terminaré con mucha duplicación de código. Además, en este caso, el XMLModel.new
devuelve un nuevo XMLModel
, mientras que el método de fábrica XMLModel.from_xml
devuelve un nuevo XMLModel::V1
.
Ideas?
¿Se puede ocultar esa declaración 'if' en la inicialización XMLModel (es decir,' new') ... Me parece que no puede sin usar una inicialización de fábrica por separado, es decir, 'XMLModel.create'. Me gustaría que la gente no tenga que saber sobre el control de versiones y poder usar el objeto como un objeto Ruby normal y llamar a 'XMLModel.new', ocultando así toda la implementación detrás del modelo. –
puede anular ':: new'. El nuevo método predeterminado es (creo) algo así como: 'def new (* args); obj = asignar; obj.initialize (* args); retrun obj; end' Disculpa por el texto único, los comentarios y el código no se mezclan bien. – Ian
agregó una respuesta con más elaboración de la redefinición :: new – Ian