मेरा मानना है कि वास्तविक कारण कई लोगों को लगता है कि कक्षाएं होनी चाहिए final
/ sealed
यह है कि अधिकांश गैर-अमूर्त विस्तार योग्य कक्षाएं ठीक से प्रलेखित नहीं हैं ।
मुझे विस्तार से बताएं दूर से शुरू होने पर, कुछ प्रोग्रामर्स के बीच यह विचार है कि ओओपी में एक उपकरण के रूप में विरासत का व्यापक रूप से दुरुपयोग और दुरुपयोग किया जाता है। हम सभी ने लिस्कोव प्रतिस्थापन सिद्धांत पढ़ा है, हालांकि यह हमें सैकड़ों (शायद हजारों भी) का उल्लंघन करने से रोक नहीं पाया।
बात प्रोग्रामर्स कोड का पुन: उपयोग करने के लिए प्यार है। तब भी जब यह इतना अच्छा विचार नहीं है। और इनहेरिटेंस कोड के इस "पुन: उपयोग" में एक महत्वपूर्ण उपकरण है। अंतिम / सील प्रश्न पर वापस जाएं।
एक अंतिम / सील वर्ग के लिए उचित प्रलेखन अपेक्षाकृत छोटा है: आप वर्णन करते हैं कि प्रत्येक विधि क्या करती है, तर्क क्या हैं, वापसी मूल्य, आदि सभी सामान्य सामान।
हालाँकि, जब आप एक विस्तार योग्य वर्ग का सही ढंग से दस्तावेजीकरण कर रहे हैं, तो आपको कम से कम निम्नलिखित को शामिल करना होगा :
- तरीकों के बीच निर्भरता (कौन सी विधि किसको कॉल करती है, आदि)
- स्थानीय चर पर निर्भरता
- आंतरिक अनुबंध जो विस्तारित वर्ग का सम्मान करना चाहिए
- प्रत्येक विधि के लिए कॉल कन्वेंशन (जैसे जब आप इसे ओवरराइड करते हैं, तो क्या आप
super
कार्यान्वयन को कॉल करते हैं? क्या आप इसे विधि की शुरुआत में कहते हैं, या अंत में? कंस्ट्रक्टर बनाम विध्वंसक सोचो)
- ...
ये मेरे सिर के ठीक ऊपर हैं। और मैं आपको इस बात का एक उदाहरण प्रदान कर सकता हूं कि इनमें से प्रत्येक क्यों महत्वपूर्ण है और इसे लंघन करने से एक विस्तारित वर्ग खराब हो जाएगा।
अब, विचार करें कि इनमें से प्रत्येक चीज़ का दस्तावेजीकरण करने के लिए दस्तावेज़ीकरण प्रयास कितना सही होना चाहिए। मेरा मानना है कि 7-8 तरीकों वाला एक वर्ग (जो एक आदर्श दुनिया में बहुत अधिक हो सकता है, लेकिन वास्तविक में बहुत कम है) साथ ही 5 पृष्ठों के बारे में एक दस्तावेज हो सकता है, केवल-पाठ। इसलिए, इसके बजाय, हम आधे रास्ते से बाहर निकल गए और कक्षा को सील नहीं किया, ताकि अन्य लोग इसका उपयोग कर सकें, लेकिन इसे ठीक से दस्तावेज न करें, क्योंकि यह एक विशाल राशि लेगा (और, आप जानते हैं, यह हो सकता है वैसे भी कभी नहीं बढ़ाया जाना चाहिए, तो क्यों परेशान?)।
यदि आप एक कक्षा डिजाइन कर रहे हैं, तो आप इसे सील करने के लिए प्रलोभन महसूस कर सकते हैं ताकि लोग इसे उस तरह से उपयोग न कर सकें, जिसे आपने (और तैयार नहीं) किया है। दूसरी ओर जब आप किसी और के कोड का उपयोग कर रहे होते हैं, तो कभी-कभी सार्वजनिक एपीआई से वर्ग के अंतिम होने का कोई स्पष्ट कारण नहीं होता है, और आप सोच सकते हैं "लानत है, यह सिर्फ मुझे एक वर्कअराउंड की तलाश में 30 मिनट का समय लगता है"।
मुझे लगता है कि एक समाधान के कुछ तत्व हैं:
- यह सुनिश्चित करने के लिए कि कोड के ग्राहक होने पर, और वास्तव में वंशानुक्रम पर रचना का पक्ष लेना एक अच्छा विचार है ।
- दूसरा यह सुनिश्चित करने के लिए कि यह उल्लेख किया गया है कि आप कुछ अनदेखी नहीं कर रहे हैं, यह सुनिश्चित करने के लिए मैनुअल को पूरी तरह से (फिर से एक ग्राहक के रूप में) पढ़ने के लिए ।
- तीसरा, जब आप कोड का एक टुकड़ा लिख रहे हों, जिसका उपयोग ग्राहक करेगा, तो कोड के लिए उचित दस्तावेज लिखें (हाँ, लंबा रास्ता)। एक सकारात्मक उदाहरण के रूप में, मैं Apple के iOS डॉक्स दे सकता हूं। वे उपयोगकर्ता के लिए हमेशा अपनी कक्षाओं को ठीक से विस्तारित करने के लिए पर्याप्त नहीं होते हैं, लेकिन वे कम से कम कुछ जानकारी विरासत में शामिल करते हैं। जो सबसे अधिक एपीआई के लिए कह सकता हूं, उससे अधिक है।
- चौथा, वास्तव में अपने स्वयं के वर्ग का विस्तार करने की कोशिश करें, यह सुनिश्चित करने के लिए कि यह काम करता है। मैं एपीआई में कई नमूनों और परीक्षणों को शामिल करने का एक बड़ा समर्थक हूं, और जब आप एक परीक्षण कर रहे होते हैं, तो आप विरासत श्रृंखलाओं का भी परीक्षण कर सकते हैं: वे आपके अनुबंध का एक हिस्सा हैं!
- पांचवीं, ऐसी स्थितियों में जब आप संदेह में हों, यह इंगित करें कि कक्षा का विस्तार करने का मतलब नहीं है और ऐसा करना एक बुरा विचार है (tm)। संकेत दें कि आपको ऐसे अनपेक्षित उपयोग के लिए जवाबदेह नहीं ठहराया जाना चाहिए, लेकिन फिर भी कक्षा को सील न करें। जाहिर है, यह उन मामलों को कवर नहीं करता है जब कक्षा को 100% सील किया जाना चाहिए।
- अंत में, जब एक वर्ग को सील करते हैं, तो एक इंटरमीडिएट हुक के रूप में एक इंटरफ़ेस प्रदान करें, ताकि ग्राहक वर्ग के अपने स्वयं के संशोधित संस्करण को "फिर से लिखना" कर सके और आपके 'सील' वर्ग के आसपास काम कर सके। इस तरह, वह अपने कार्यान्वयन के साथ सीलबंद वर्ग को बदल सकता है। अब, यह स्पष्ट होना चाहिए, क्योंकि यह अपने सरलतम रूप में ढीली युग्मन है, लेकिन यह अभी भी एक उल्लेख के लायक है।
यह भी निम्नलिखित "दार्शनिक" सवाल का उल्लेख के लायक है: क्या एक वर्ग है sealed
/ final
वर्ग, या एक कार्यान्वयन विस्तार के लिए अनुबंध का हिस्सा? अब मैं वहां नहीं चलना चाहता, लेकिन इसका एक उत्तर आपके निर्णय को प्रभावित करना चाहिए कि एक वर्ग को सील करना है या नहीं।
Open/Closed principle
, नहींClosed Principle.