2009-12-29 15 views
10

प्रोजेक्ट में मैं काम करता हूं, हम मेडिकल बिलिंग को संभालते हैं।पीछे की संगतता का समर्थन करने के लिए कक्षा संस्करण

हर बार राज्य आधिकारिक रूप में परिवर्तन करता है (जो हमारे डेटा वर्गों का प्रतिनिधित्व करता है), पिछले रूपों के साथ पिछड़े संगतता को बनाए रखने के लिए, हम नई गुण जोड़ते हैं लेकिन पुराने लोगों को बरकरार रखते हैं, और एक दस्तावेज़ संस्करण रखते हैं संपत्ति का उपयोग यह निर्धारित करने के लिए किया जाता है कि सत्यापन क्या किया जाता है और यूआई क्रियाओं को प्रदर्शित करने के लिए।

इसने परियोजना के जीवन (लगभग 5 वर्षों के राज्य-अनिवार्य परिवर्तन) पर फूला हुआ वर्गों का नेतृत्व किया है, और बस पुराने दस्तावेज़ स्वरूपों का समर्थन नहीं करना एक विकल्प नहीं है।

मैं प्रत्येक दस्तावेज़ संस्करण के लिए एक नई कक्षा बनाने का प्रयास करना चाहता हूं, लेकिन फिर भी हमारे पास बहुत समान (हालांकि थोड़ा बदल गया) कोड की कई प्रतियां होंगी। और ProgressNoteV16 जैसे वर्ग नाम, प्रोग्रेसनोटेवी 17 भयानक लगते हैं।

विरासत का उपयोग नहीं किया जा सकता है, क्योंकि इससे अभी भी एक ही समस्या होगी (कक्षाएं जिन गुणों की आवश्यकता नहीं है)। इंटरफेस इंटरफ़ेस को फूला हुआ बना देगा, जो इस मुद्दे को हल नहीं करेगा।

इस समस्या को हल करने के लिए उपयोग किए जाने वाले समाधान और सर्वोत्तम अभ्यास क्या हैं?

उत्तर

7

यह किसी भी एजेंसी के लिए काम करने वाली किसी भी एजेंसी के लिए काफी क्लासिक समस्या है, खासकर यदि यह सरकार या सरकारी निगरानी एजेंसी है।समाधान गैर-तुच्छ है, और इसके लिए इसे बनाने के लिए कुछ महत्वपूर्ण काम की आवश्यकता होगी, साथ ही बाद में बनाए रखा जाएगा।

यह ग्राहकों के लिए समान मुद्दों से निपटने के दौरान अतीत में मेरे लिए काम करता है, हालांकि यह आपके लिए काम नहीं कर सकता है, आपको यह पूरा करने की आवश्यकता होगी कि आप क्या करने की कोशिश कर रहे हैं और यदि ऐसा करने में यह समझदारी हो रही है।

पैटर्न के एक जोड़े के साथ परिचित होना (यदि आप पहले नहीं हैं) के होते हैं:

  1. Factory जो पहले से ही किया गया है जैसा कि पहले उल्लेख
  2. Composition जो उम्मीद है कि आप में से कुछ से बाहर निकलना होगा बदसूरत विरासत समस्याओं
  3. किस रूप में संस्करणों से करता है के तर्क को अलग करने के लिए
  4. Template

वहाँ दो किताबें है कि इन स्पष्टीकरण के लिए बहुत अच्छे हैं (और कुछ अन्य उपयोगी वाले) हैं:

  1. हेड फर्स्ट डिजाइन पैटर्न (नहीं कर सकते मेरे सिर के ऊपर से याद) उद्यम अनुप्रयोग वास्तुकला का
  2. पैटर्न (फाउलर)

प्रक्रिया मैं अतीत में इस्तेमाल किया है करने के लिए अब:

  1. प्रारंभ के अपने वर्तमान संस्करण के सभी लेने के द्वारा रूपों, उन्हें विभिन्न वर्गों में अलग करें और आम ओवरलैप की तलाश करें। आप इसे मसौदे मोड में या प्रत्येक संस्करण
  2. के लिए अपनी कक्षा की योजना के रूप में कर सकते हैं इस वर्ग संरचना से प्राप्त करें कई "आधार" ऑब्जेक्ट्स जिन्हें आप प्रत्येक महत्वपूर्ण संस्करण के संस्करणों के लिए विरासत रूट के रूप में उपयोग कर सकते हैं एक परचा। आपके पास इनमें से कई हो सकते हैं, लेकिन आपके पास कुल फॉर्म ऑब्जेक्ट्स से कम होना चाहिए।
  3. अब इन मूल वस्तुओं में से प्रत्येक में, सामान्य कार्यक्षमता (यानी नाम और पता संरचनाएं, आदि) को एक साथ समूहित करें और इसे अपने स्वयं के वर्ग पदानुक्रम में समेकित करें, इस हाइरार्की को वापस अपने आधार वर्गों में कन्स्ट्रक्टर इंजेक्शन के माध्यम से इंजेक्ट करें।
  4. अब अपने बेस क्लास पदानुक्रम में रचना पैटर्न लागू करें और जितना संभव हो उतना सामान्य वर्ग संरचना प्राप्त करने के लिए काम करें। आदर्श रूप से इस बिंदु पर आपके रूप केवल न्यूनतम कार्यक्षमता होगी जो प्रत्येक रूप में बदल गई है और एक कन्स्ट्रक्टर है जो सभी सामान्य (और शायद थोड़ा भिन्न) कार्यक्षमता लेता है।
  5. अपनी कक्षाओं से सामान्य "कार्यक्षमता" को सामान्य करने के लिए टेम्पलेट पैटर्न को लागू करें, जैसे कि सामान्य सत्यापन, और दृढ़ता तर्क, इस कार्यक्षमता को वापस अपने बेस क्लास में प्राप्त करने के लिए कन्स्ट्रक्टर इंजेक्शन का उपयोग करें।
  6. अपने बेस क्लास से इंटरफ़ेस एडाप्टर परिभाषाएं निकालें और इन्हें अपने फॉर्म के आधार पर अपने फॉर्म के आधार पर उपयोग करें
  7. इसे स्थापित करने के सभी गड़बड़ कार्यों को संभालने के लिए अपने फैक्ट्री कक्षाएं बनाएं।

आशा है कि आपको कुछ विचार बताएंगे कि क्या करना है।

+0

धन्यवाद, संघीय सरकार जिस तरह से काम कर रही है, उसमें संभावित ओवरहाल के कारण हमारे डिजाइन पर पुनर्विचार करने की क्षमता है। यह रूपरेखा संभावनाओं का पता लगाने में बहुत मदद करेगी। –

+0

एनपी। और शुभकामनाएं। कुछ तक पहुंचने की क्षमता है डीएचएस (मानव सेवा) या डीआईएस (इमिग्रेशन सर्विसेज) जैसी अन्य एजेंसियां ​​उन्हें इस समस्या को बड़े पैमाने पर लेती हैं और शायद आपको कुछ अच्छी जानकारी प्रदान करने में सक्षम हो सकती हैं। – GrayWizardx

+0

मैं इस पर आया क्योंकि मैंने अपने वर्ग के नामों में 'तिथियां' दिखाई देने लगे, यानी क्लासए, कक्षा ए20100901, कक्षा 01201201। मुझे यह समझाया गया था: कक्षा 1 1 सितंबर तक वैध/प्रयोग किया जाता है, फिर कक्षा20100901 का उपयोग किया जाएगा, फिर 1 दिसंबर को अंतिम कक्षा सक्रिय हो जाएगी। यह एक बड़ी गंध है कि कुछ गलत है। मैं इसे पचता हूं और टीम को इसका प्रस्ताव देता हूं। मुझे कोई जवाब मिलेगा कि हमें कोई सुझाव मिलना चाहिए। धन्यवाद! –

2

यदि विरासत का उपयोग नहीं किया जा सकता है "क्योंकि दस्तावेज़ में फ़ील्ड हटा दिए जा सकते हैं", तो आप वर्तमान में इसे कैसे संभालेंगे?

अपने डिजाइन के विवरण के आधार पर, आपको लगता है कि विधि के कार्यान्वयन में एक NotSupportedException या इसी तरह फेंक (यानी कि दस्तावेज़ के लिए एक उपवर्ग में ओवरराइड) दस्तावेज़ के वर्तमान संस्करण से अप्रयुक्त क्षेत्रों ओवरराइड कर और चाहिए अगर फॉर्म एक मान असाइन करने का प्रयास करता है। इसी तरह के तर्क से, आप इंटरफेस का उपयोग कर सकते हैं (और शायद चाहिए) ... केवल यह जानकर कि एक ठोस कार्यान्वयन उस संपत्ति के लिए अपवाद फेंक सकता है जो यह लागू करता है लेकिन यह यूआई के उस संस्करण के लिए परिभाषित नहीं है।

आप दिए गए फॉर्म संस्करण के लिए ऑब्जेक्ट का उपयुक्त उदाहरण वापस करने के लिए Factory Pattern का उपयोग कर सकते हैं।

यदि कोड के बीच कुछ समानता है जो थोड़ा बदल गया है लेकिन अधिकतर वही है, तो आप उस सामान्यता में से कुछ को एक निजी/संरक्षित विधि में दोबारा उपयोग करने में सक्षम हो सकते हैं जिसका प्रयोग कई सार्वजनिक तरीकों से किया जाता है।

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

+0

"अगर विरासत का उपयोग नहीं किया जा सकता" क्योंकि दस्तावेज़ में फ़ील्ड को हटाया जा सकता है ", आप वर्तमान में इसे कैसे संभालेंगे?" वह कक्षाओं की समस्या को हल करने में विफल रहेगा (पिछली संस्करणों से पीछे की संगतता के लिए छोड़े गए पिछले संस्करणों से) –

+0

कारखाना पैटर्न एक व्यावहारिक समाधान की तरह प्रतीत होता है, और चूंकि डाटाबेसिंग स्वीकार करने वाले तारों में मजबूत टाइपिंग नहीं होगी कंपाइलर त्रुटियां ... –

+0

@Aequitarum: यूआई का विशिष्ट संस्करण संभावित रूप से उन फ़ील्ड से बंधे नहीं है जो उस संस्करण के लिए अनुपयुक्त हैं। संस्करण-विशिष्ट उप-वर्ग को एक NotImplementedException फेंकने के बाद यदि ऐसी कोई संपत्ति यूआई द्वारा सभी मदद के बाद बाध्य होती है इस तरह की समस्याओं को जल्दी पकड़ो। –

0

मैं इसे एक बहुत ही कमजोर युग्मित तरीके से कार्यान्वित करता हूं - एक वर्ग जिसमें दो फ़ील्ड होते हैं: एक संस्करण और एक शब्दकोश। जब डेटा बहुत अधिक बदलता है तो खोने और जोड़े गए गुणों का ट्रैक रखने और ट्रैक करने के लिए यह बहुत कठिन हो जाता है। एक शब्दकोश के साथ आप यह देखने के लिए बस जांच सकते हैं कि कुंजी मौजूद है या नहीं।

0
अपने कोड के किसी भी अधिक जानकारी के बिना

, मुझे लगता है कि आप शायद डेकोरेटर डिज़ाइन पैटर्न विचारों की कोशिश कर सकते ... इस लेख पर एक नज़र डालें: Avoid Excessive Subclassing with the Decorator Design Pattern

मार्टिन Fowler द्वारा Patterns for things that change with time जांच की जा रही है भी एक सार्थक पढ़ने के लिए इस तरह के डिजाइन परिदृश्य के लिए उपयोगी विचार प्राप्त करें।

संबंधित मुद्दे