वंशानुक्रम का उपयोग करने के लिए, 'सिर्फ बूलियन फ़ील्ड' का उपयोग कब करें?


18

हमारे रेल आवेदन में, हम सूचनाएं जोड़ रहे हैं। इनमें से कुछ हैं blocking: वे उस संसाधन की प्रगति को रोक देते हैं जिस पर उन्हें जोड़ा जाता है, क्योंकि उस संसाधन की कुछ जानकारी गायब है।

अन्य सूचनाएं सरल सूचनाएं हैं, और केवल जानकारी प्रदान करती हैं।

आज हमारी टीम में एक और प्रोग्रामर के साथ चर्चा हुई। मैंने इस तरह की विरासत संरचना बनाई है:

यहाँ छवि विवरण दर्ज करें

हालांकि, वह मुझे blockingप्रत्येक अधिसूचना पर एक बूलियन-रिटर्निंग विधि के रूप में जोड़ना चाहेंगे , और अधिसूचना माता-पिता वर्ग के अंदर अवरुद्ध होने वाले उपवर्गों की एक सूची निर्दिष्ट करें।

इन दृष्टिकोणों के बीच का अंतर बहुत बड़ा नहीं है; मेरे दृष्टिकोण में रूट क्लास क्लीनर को ध्यान में रखते हुए इस सूची को निर्दिष्ट करने की आवश्यकता नहीं है। दूसरी ओर, अभी जो विशेष तर्क होता Notification::Blockingहै, वह बहुत बड़ा नहीं है।

इस समस्या के लिए किस तरह का अमूर्त अधिक अनुकूल है?


11
एक अभिभावक वर्ग को इसके बच्चों के बारे में कभी नहीं जानना चाहिए। आपको उप-वर्गों की सूची रखने की आवश्यकता क्यों है?
coteyr

उन्हें एक संसाधन पर कैसे जोड़ा जाता है और वे इसकी प्रगति को कैसे रोकते हैं?
अशक्त

3
आपको कई अधिसूचना वर्गों की आवश्यकता क्यों है? मुझे लगता है कि आप एक सूचना वर्ग बना सकते हैं, फिर डेटा प्रकारों के बजाय डेटा को कार्रवाई करने दें।
Trisped

1
@ अप्रतिष्ठित: सही है, यदि आप मामलों की एक विस्तृत सूची के साथ खुद को आधार वर्ग में व्यवहार के एक पहलू को आगे बढ़ाते हुए पाते हैं, तो अपने विश्वासों की हिम्मत रखें, स्वीकार करें कि आप वास्तव में विस्तार द्वारा अनुकूलन के लिए उपयोग करने योग्य आधार वर्ग नहीं बना रहे हैं , और सभी व्यवहार को आधार वर्ग में स्थानांतरित करें !
स्टीव जेसोप

जवाबों:


35

आप व्युत्पन्न वर्गों के बारे में जानने के आधार वर्गों से बचना चाहते हैं। यह तंग युग्मन का परिचय देता है और एक रखरखाव सिरदर्द है क्योंकि आपको हर बार जब आप एक नया व्युत्पन्न वर्ग बनाते हैं तो सूची में जोड़ना याद रखना होगा।

यदि आप कई परियोजनाओं में इस वर्ग का उपयोग करना चाहते हैं तो यह अधिसूचना वर्ग / पुन: प्रयोज्य वर्ग / विधानसभा में डालने में सक्षम होने से भी रोकेगा।

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


3
इस। एक जगह निर्णय लें। कक्षा और सूची के बीच कौन से वर्ग ब्लॉक होते हैं, इसका ज्ञान बिखेरें नहीं।
candied_orange

यह वह है जो मैं करता हूं, बहुत अच्छी तरह से काम करता है और बहुत पुन: प्रयोज्य है।
coteyr

13

और उपवर्गों की एक सूची निर्दिष्ट करें जो अधिसूचना जनक वर्ग के अंदर अवरुद्ध कर रहे हैं।

यह बहुत अजीब लग रहा है और एक विशेष कोड गंध है।

यदि आप वर्गों के बीच व्यवहार में अंतर रखते हैं, तो मैं उपवर्ग प्रदान करूंगा, और आप इन सभी सूचनाओं को एक ही अंदाज में व्यवहार करना चाहते हैं (अर्थात बहुरूपता का उपयोग करना )।


1
मुझे लगता है कि "व्यवहार" यहां महत्वपूर्ण है: जब यह सिर्फ डेटा होता है, तो क्षेत्र को एक पर्याप्त भेदभाव होना चाहिए। बहुरूपता बहुरूपता का उपयोग करने के लिए बेहतर कारण है, हालांकि किसी को वंशानुगत पदानुक्रम बनाते समय हमेशा रखरखाव जटिलता पर विचार करना चाहिए। En.wikipedia.org/wiki/Composition_over_inheritance
cottsak

7

मौजूदा उत्तरों के लिए एक संकेत के रूप में, मैं सुझाव दूंगा कि बूलियन प्रॉपर्टी सबसे अच्छा विकल्प है यदि उपयोग किए जाने वाले मोड को गतिशील रूप से बदलना आवश्यक है (जैसे एक कॉन्फ़िगरेशन फ़ाइल के माध्यम से जो कि किस प्रकार को अवरुद्ध करना है की एक सूची देता है। और जो नहीं हैं)।

उस ने कहा, इस स्थिति में भी एक बेहतर डिजाइन एक डेकोरेटर ऑब्जेक्ट का उपयोग कर सकता है।


1

मैं कहूंगा कि यह इस बात पर निर्भर करता है कि एक अवरुद्ध अधिसूचना के बारे में और कितना विशेष है, हालांकि मेरा पहला विचार "दोनों" के साथ जाना है:

class Notification
 virtual Boolean Blocking{get return false;}

class BlockingNotification inherits Notification
 virtual overrides Boolean Blocking{get return true;}

इस तरह, आप उपयोग कर सकते हैं n.Blockingया n is BlockingNotification(छद्म कोड में सभी), हालांकि, अगर आप एक संदर्भ के प्रति संवेदनशील लागू करने के लिए एक वर्ग के लिए अनुमति देने के लिए जा रहे हैं Blockingके रूप में आपको लगता है कि मूल्य हर बार जांच करने के लिए होगा मूल्य, देखकर, BlockingNotificationवर्ग बन जाता है कम उपयोगी है।

किसी भी मामले में, मैं अन्य उत्तरों से सहमत हूं कि आप बेस क्लास कार्यान्वयन Blockingको व्युत्पन्न वर्गों के बारे में नहीं जानना चाहते हैं।


0

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

यह आपको सूचनाओं को संसाधित करने और प्रस्तुत करने के लिए कोड के एक सेट का उपयोग करने की अनुमति देता है और आपके कोड की जटिलता को कम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.