जब आप एक ऐसे एप्लिकेशन को लिख रहे हैं जिसे डेटा के दो संस्करणों के साथ पढ़ने और काम करने की आवश्यकता है, तो उस डेटा का प्रतिनिधित्व करने के लिए अपनी कक्षाओं को व्यवस्थित करने का सबसे अच्छा तरीका क्या है। मैं तीन परिदृश्य के साथ आए हैं:डेटा के विभिन्न संस्करणों को स्टोर करने का पसंदीदा तरीका क्या है?
- आम बेस/विशिष्ट बच्चे
- अलग संरचनाएं
संस्करण 1 कार उदाहरण
byte DoorCount
int Color
byte HasMoonroof
byte HasSpoiler
float EngineSize
byte CylinderCount
संस्करण 2 कार
byte DoorCount
int Color
enum:int MoonRoofType
enum:int TrunkAccessories
enum:int EngineType
आम बेस/विशिष्ट बच्चे
इस पद्धति से, डेटा के दो संस्करणों और डेटा के प्रत्येक संस्करण के लिए एक बच्चे के वर्ग के बीच आम क्षेत्रों में से एक आधार वर्ग है।
class Car {
byte DoorCount;
int Color;
}
class CarVersion1 : Car {
byte HasMoonroof;
byte HasSpoiler;
float EngineSize;
byte CylinderCount;
}
class CarVersion2 : Car {
int MoonRoofType;
int TrunkAccessories;
int EngineType;
}
शक्तियों
- OOP प्रतिमान
कमजोरियों
- मौजूदा बच्चे कक्षाओं को बदलने के लिए होगा अगर एक नया संस्करण जारी किया जाता है कि एक आम क्षेत्र को हटा
- एक कॉन्स के लिए डेटा एप्टुअल यूनिट को दो परिभाषाओं के बीच विभाजित किया जाता है क्योंकि किसी भी विभाजन के लिए अर्थपूर्ण नहीं है।
डाटा संघ
यहाँ, एक कार डेटा के सभी संस्करणों में कार के क्षेत्र के मिलन के रूप में परिभाषित किया गया है।
class Car {
CarVersion version;
byte DoorCount;
int Color;
int MoonRoofType; //boolean if Version 1
int TrunkAccessories; //boolean if Version 1
int EngineType; //CylinderCount if Version 1
float EngineSize; //Not used if Version2
}
शक्तियों
- उम ... सब कुछ एक ही स्थान पर है।
कमजोरियों
- मजबूर मामले संचालित कोड।
- जब कोई अन्य संस्करण रिलीज़ होता है या विरासत को हटाया जाता है तो इसे बनाए रखने में मुश्किल होती है।
- अवधारणा को समझना मुश्किल है। फ़ील्ड के अर्थ संस्करण के आधार पर बदल गए हैं।
अलग संरचनाएं
यहाँ संरचनाओं एक दूसरे से कोई OOP रिश्ता है।हालांकि, दोनों कक्षाओं द्वारा इंटरफेस लागू किया जा सकता है यदि कोड उसी समय में उनका इलाज करने की अपेक्षा करता है।
class CarVersion1 {
byte DoorCount;
int Color;
byte HasMoonroof;
byte HasSpoiler;
float EngineSize;
byte CylinderCount;
}
class CarVersion2 {
byte DoorCount;
int Color;
int MoonRoofType;
int TrunkAccessories;
int EngineType;
}
शक्तियों
- स्पष्ट दृष्टिकोण
- आसान बनाए रखने के लिए करता है, तो एक नया संस्करण जोड़ा जाता है या विरासत निकाल दिया जाता है।
कमजोरियों
- यह एक विरोधी पैटर्न है।
क्या कोई बेहतर तरीका है जिसके बारे में मैंने नहीं सोचा था? यह शायद स्पष्ट है कि मैं आखिरी पद्धति का समर्थन करता हूं, लेकिन क्या पहला बेहतर है?
ठीक है, शायद मैंने कहा कि आखिरी विकल्प एक विरोधी पैटर्न था क्योंकि यह "समान" वैचारिक वस्तु के दो प्रतिनिधित्वों के लिए बेस क्लास का उपयोग नहीं करता है। "यह शायद ही पता चला है कि बेस क्लास इसके उत्तराधिकारी के करीब है" - हाँ, मैं बस पद्धतियों का प्रदर्शन करने के लिए एक संक्षिप्त उदाहरण का विरोध करने की कोशिश कर रहा था। तो क्या मैं समझ रहा हूं कि आप तीसरे विकल्प की वकालत करेंगे और यदि आवेदन कोड लिखा गया था तो पहले की आवश्यकता होगी? –
हां, यह मेरे (लंबे) उत्तर का एक शर्मनाक संक्षेप सारांश था। –
मैं पूरी तरह से सहमत हूं। –