मेरे पास रूबी ऑब्जेक्ट्स की एक श्रृंखला है जो अंतर्निहित एक्सएमएल (ओएक्सएम की तरह) मॉडल करती है। दुर्भाग्यवश, एक्सएमएल बदल रहा है और इसी संस्करण को टक्कर लगी है। मुझे अपने रूबी ऑब्जेक्ट्स को दोनों संस्करणों को संभालने में सक्षम होने की आवश्यकता है। मैं अपने तरीकों में अगर/अन्य खंडों के एक टन से कुछ क्लीनर चाहता हूं, क्योंकि यह फिर से होने की संभावना है। क्या इसे संभालने के लिए एक मूर्खतापूर्ण रूबी तरीका है? मैं विभिन्न के लिए एक प्रॉक्सी "संस्करणीकृत" वर्ग के रूप में आधार वर्ग का उपयोग करने का सोच रहा था, यानीरूबी ऑब्जेक्ट का संस्करण
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 प्रारंभ (अर्थात 'new') में' if' बयान ... मैं एक अलग कारखाने intialization है, यानी 'XMLModel.create' का उपयोग किए बिना नहीं कर पा रहे। मैं लोगों को संस्करण के बारे में नहीं जानना चाहता हूं और सामान्य रूबी ऑब्जेक्ट के रूप में ऑब्जेक्ट का उपयोग करने में सक्षम हूं और 'XMLModel.new' पर कॉल कर रहा हूं, इस प्रकार मॉडल के पीछे सभी कार्यान्वयन को छुपा रहा हूं। –
आप ':: new' को ओवरराइड कर सकते हैं। डिफ़ॉल्ट नई विधि (मुझे लगता है) कुछ ऐसा है: 'def new (* args); obj = आवंटित करें; obj.initialize (* args); obj retrun; अंत 'एक लाइनर के लिए खेद है, टिप्पणियां और कोड अच्छी तरह से मिश्रण नहीं करते हैं। – Ian
ने फिर से परिभाषित करने के अधिक विस्तार के साथ एक उत्तर जोड़ा :: नया – Ian