सॉफ्टवेयर के विभिन्न संस्करणों के बीच फ़ाइलों की पश्चगामी संगतता की अनुमति देने के लिए एक अच्छा डिज़ाइन क्या है?


14

सॉफ्टवेयर के विभिन्न संस्करणों के बीच फ़ाइल प्रकार के पीछे की संगतता की अनुमति देने के लिए एक अच्छा डिज़ाइन क्या है?

उदाहरण के लिए, Microsoft को 2007, 2010 और 2013 आदि शब्द कैसे मिलते हैं ... सभी docx फ़ाइलों को खोलने के लिए, लेकिन विभिन्न संस्करण अधिक / कम डेटा को सहेज सकते हैं और डेटा को थोड़े अलग तरीके से सहेज सकते हैं, सभी एक ही फ़ाइल प्रकार और एक एक संस्करण में सहेजी गई फ़ाइल को दूसरे में खोला जा सकता है, लेकिन पुराने संस्करणों में फ़ाइल के कुछ तत्व उपलब्ध नहीं हो सकते हैं?

मेरा मतलब है, ऐसा करने का वास्तव में स्पष्ट तरीका कुछ ऐसा है

private string openfile(string filename)
{
    File.Open(filename)

    ... some logic that gets a header from the file that will never change

    switch (fileversion)
        case 2007:
            .....
        case 2010
            .....
        case 2013
            .....
}

लेकिन ऐसा लगता है कि अविश्वसनीय रूप से अखंड है, बहुत एक्स्टेंसिबल नहीं है, और बहुत सारे कॉपी / पेस्ट कोड के लिए नेतृत्व करने की संभावना है।

इसलिए मैं सभी संस्करणों के लिए एक आधार इंटरफ़ेस का उपयोग करने के बारे में सोच रहा था जो अपरिवर्तनीय संरचनाओं को परिभाषित करता है, जैसे कि हेडर, जिसे फ़ाइल में मौजूद होने की आवश्यकता है, और विधियाँ जो क्रमबद्धता / deserialisation के लिए उपलब्ध होने की आवश्यकता है, फिर कई विरासत हैं ताकि प्रत्येक नए संस्करण की कक्षा जो इंटरफ़ेस को लागू करती है, पुराने संस्करण को विरासत में मिला है, और केवल उस सामान को ओवरराइड करता है जो बदल गया है, क्योंकि फ़ाइल अधिकांश भाग के लिए समान होगी।

मैं वास्तव में फ़ाइल की संरचना के बारे में परेशान नहीं हूं, क्योंकि यह पहले से ही तय कर चुका है कि हम XML का उपयोग कर रहे हैं, और प्रारंभिक स्कीमा, पहले से ही तय किया गया है। हालांकि भविष्य में इसमें कोई संदेह नहीं होगा, और मैं सिर्फ एक तरह से कोड को डिजाइन करने में सक्षम होना चाहता हूं जिससे इन परिवर्तनों को समायोजित करना आसान हो।


6
आपको फ़ाइल प्रारूप को डिज़ाइन करना चाहिए ताकि न केवल यह जानकारी को अनदेखा कर दे जो कि गायब है क्योंकि स्रोत पहले के संस्करण से है, बल्कि यह भी जानकारी है कि यह उम्मीद नहीं करता है क्योंकि स्रोत एक नए संस्करण से है। यदि आप खरोंच से शुरू कर रहे हैं, तो कृपया कृपया आगे संगतता भी करें। यह लगभग कोई अतिरिक्त प्रयास नहीं है और आपके सॉफ़्टवेयर की उपयोगिता को दोगुना करता है।
किलियन फोथ

एक खुले पर, क्या आप हमेशा सामने वाले (जैसे, हेडर से) को जानते हैं कि आप किस फ़ाइल संस्करण के साथ काम कर रहे हैं? इसके अलावा, एक और अनुरोध करने के लिए, कृपया कृपया भ्रष्ट या दुर्भावनापूर्ण फ़ाइलों की जांच करें और उन्हें समस्या न दें। आपके sysadmins आपको धन्यवाद देंगे :)।
cxw

1
हां, संस्करण संख्या हमेशा फ़ाइल हेडर में होगी, और हेडर प्रारूप कभी नहीं बदलेगा। हम इस विचार के साथ जा रहे हैं कि मामूली सॉफ़्टवेयर संशोधनों के बीच बनाई गई फ़ाइलें संगत होनी चाहिए, अर्थात v1.1 में बनाई गई फ़ाइल v1.2 में खोली जा सकती है और इसके विपरीत, 1.2 से कुछ कार्यक्षमता 1.1 में गायब हो सकती है, लेकिन प्रमुख संशोधन आगे की संगतता को तोड़ देगा, इसलिए v2 में लिखा सामान v1 में नहीं खुलेगा, लेकिन v1 में लिखा गया सामान v2 में खुलेगा।
JJBurgess

और भ्रष्टाचार की बात के लिए, फ़ाइलों में डीएसएल होता है, और उन्हें खोलने / बंद करने का कार्यक्रम एक कस्टम-इन हाउस आईडीई / कंपाइलर है। ये उत्पादन के वातावरण के आस-पास कहीं भी नहीं होंगे, इसलिए व्यवस्थापक की चिंता नहीं करनी चाहिए।
JJBurgess

जवाबों:


10

आप PNG फ़ाइल स्वरूप पर नज़र डाल सकते हैं और यह संस्करण संगतता को कैसे संभालता है। हर ब्लॉक में एक आईडी होती है जो बताती है कि यह किस तरह का ब्लॉक है, और इसमें कुछ झंडे हैं जो सॉफ्टवेयर को बताते हैं कि अगर उस आईडी को नहीं समझ सकते तो क्या करें। उदाहरण के लिए "यदि आप इस ब्लॉक को नहीं समझते हैं तो आप फ़ाइल को नहीं पढ़ सकते हैं", या "आप फ़ाइल को पढ़ सकते हैं लेकिन इसे संशोधित नहीं कर सकते हैं", या "आप फ़ाइल को संशोधित कर सकते हैं लेकिन आपको इस ब्लॉक को हटाना होगा"। पिछड़े संगतता के लिए, आपके सॉफ़्टवेयर को केवल उस स्थिति को संभालने की आवश्यकता होती है जब कोई अपेक्षित डेटा मौजूद नहीं होता है।


महान विचार! पीएनजी प्रारूप संस्करणों पर निर्भर करता है न कि सुविधाओं पर। हालांकि, इसका मतलब यह है कि मूल प्रारूप को कभी नहीं बदलना चाहिए। (यानी हेडर फीचर को परिभाषित करता है।)
फ्लोरियन मार्गाइन

यह तो दिलचस्प है। मैं इस समय फ़ाइल विनिर्देश के माध्यम से पढ़ रहा हूँ। मुझे आलोचनात्मक और अनुषंगी
विडंबनाओं

3

ऐसा करने का एक तरीका आपकी फ़ाइल हैंडलिंग के लिए बुनियादी कार्यों के साथ एक बेस क्लास और इंटरफ़ेस का उपयोग करके हो सकता है। फिर प्रत्येक संस्करण के लिए कक्षाओं का उपयोग करें जो सभी संस्करण विशिष्ट मामलों को संभालने के लिए आधार वर्ग से विस्तारित होते हैं। यदि आप केवल विशिष्ट संस्करण लागू कर रहे हैं तो कार्य के सार के आधार पर आप आभासी हो सकते हैं। जब आपको फ़ाइल को संभालने के लिए एक वर्ग की आवश्यकता होती है, तो एक कारखाने का उपयोग करें जो फ़ाइल हैंडलिंग इंटरफ़ेस का संस्करण विशिष्ट कार्यान्वयन प्राप्त करता है।


इसके साथ मेरा एकमात्र मुद्दा यह है कि आप प्रत्येक बाद के संशोधन के लिए संस्करण विशिष्ट कार्यान्वयन की नकल करेंगे। कहते हैं कि आपके पास तीन आधार वर्ग विधियाँ हैं: ReadNames (), ReadAges () और ReadAddresses () और वर्ग के V2 में, आप ReadAges () में परिवर्तन करते हैं। यदि V3 में, आप तब ReadNames () में परिवर्तन करने का निर्णय लेते हैं, यदि आपके सभी संस्करण विशिष्ट वर्ग आधार से विरासत में प्राप्त कर रहे हैं, तो आप अपने V2 परिवर्तनों को खो देंगे, या आपको V2 से परिवर्तनों को कॉपी / पेस्ट करना होगा। V3 कार्यान्वयन में भी।
JJBurgess

1
रीडिज़ के कार्यान्वयन को एक अलग वर्ग कहा जा सकता है जो इस संस्करण के लिए युगों को पढ़ने के लिए वास्तविक कार्यान्वयन रखता है। आपकी कक्षा बनाना वास्तविक प्रोग्रामिंग की तुलना में इंटरफेस / कारखानों का अधिक विन्यास होगा।
सहकर्मी

2

मैंने XML के साथ ऐसा किया है और यह अच्छी तरह से काम करता है:

अपने दस्तावेज़ में किसी भी तत्व, किसी भी विशेषता और किसी भी सबलेमेंट (और जब ऑर्डर महत्वपूर्ण नहीं है - किसी भी क्रम में) की अनुमति दें। कार्यक्रम के पहले संस्करण से शुरुआत - दस्तावेज़ पढ़ते समय, उन विशेषताओं और उप-तत्वों को अनदेखा करें जिन्हें आप वर्तमान संस्करण में नहीं जानते हैं।

भविष्य में जब आप प्रोग्राम के नए संस्करण में नई सुविधा जोड़ रहे हैं तो विशेषता या उप-तत्व जोड़ें। पुराने संस्करण इसे अनदेखा करेंगे। नए संस्करण को विशेषता या उप-तत्व के दबाव की जांच करनी चाहिए और इसके साथ संभालना चाहिए।

उदाहरण के लिए आपके पास ग्रंथों के साथ कुछ आइटम हैं:

<item text="Hello, world!"/>

और नए संस्करण में आप आइटम में रंग जोड़ना चाहेंगे ताकि आप विशेषता जोड़ें color:

<item text="Hello, world!" color="008000"/>

colorदस्तावेज़ खोलते समय पुराना संस्करण केवल विशेषता को अनदेखा करेगा । नए संस्करण colorविशेषता के दबाव की जांच करते हैं और यदि मौजूद नहीं है तो डिफ़ॉल्ट रंग प्रदान करता है।

इस सरल समाधान के साथ आप पिछड़े और आगे संगतता दोनों होगा।


"साधारण" विकल्प के रूप में इसके साथ मामूली मुद्दा यह है कि आप दस्तावेज़ को सहेजते समय सभी अप्रत्याशित विशेषताओं (या उन्हें अपरिवर्तित रखें) को हटा देंगे। जैसा कि अन्य उत्तरों में उल्लेख किया गया है, एक बेहतर समाधान कम से कम कुछ संस्करण अज्ञेय तरीके से निर्धारित करता है कि क्या एक विशेषता को गिरा दिया जाना चाहिए, या दस्तावेज़ को केवल उन संस्करणों के लिए पढ़ने के लिए कारण बन सकता है जो इसे नहीं समझते हैं।
मार्क हर्ड

@ मर्क हद्र: हां, मैं चुपचाप यह मान रहा हूं कि पिछड़ी अनुकूलता होनी चाहिए और आगे की अनुकूलता बोनस है। जब कोई व्यक्ति पुराने संस्करणों में नए दस्तावेज़ खोलता है तो उन्हें आश्चर्य नहीं होना चाहिए कि जब वे इसे सहेजते हैं, तो उन्होंने कुछ खो दिया जो पुराने ऐप में पहले से दिखाई नहीं दे रहा है। अतिरिक्त लॉजिक्स मेरे लिए अतिरंजित लगता है।
user3123061
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.