我有一系列的Ruby對象,它們爲底層XML(比如OXM)建模。不幸的是,XML正在改變,相應的版本正在被碰撞。我需要更新我的Ruby對象,以便能夠處理這兩個版本。我想要的東西比我的方法中的一大堆if/else子句更清潔,因爲這可能會再次發生。有沒有一種慣用的Ruby方法來處理這個問題?我想用的基類的「版本」類的各種代理,即版本化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
。
想法?
你可以在XMLModel初始化中隱藏'if'語句(即'new')......我似乎沒有使用單獨的工廠初始化,即'XMLModel.create'。我希望人們不必知道版本控制,並能夠將該對象用作普通的Ruby對象,並調用XMLModel.new,從而隱藏模型後面的所有實現。 –
你可以重寫':: new'。默認的新方法是(我認爲)是這樣的:'def new(* args); obj = allocate; obj.initialize(*參數);逆時針結尾'抱歉的一行,評論和代碼混合不好。 – Ian
添加了一個更詳細的重新定義答案:: new – Ian