क्या मुझे उन सभी वर्गों को सील करना चाहिए जिन्हें मुझे कभी भी बेस क्लास के रूप में उपयोग नहीं किया जाना चाहिए, भले ही कोई ठोस प्रदर्शन या सुरक्षा चिंता न हो, या क्या यह केवल क्रूरता जोड़ रहा है?क्या मुझे उन सभी वर्गों को सील करना चाहिए जिन्हें मुझे पता है कि कभी भी बेस क्लास के रूप में उपयोग नहीं किया जाना चाहिए?
उत्तर
एक वर्ग जो एक्स्टेंसिबल है वह उस सुविधा को लागू करता है जिसे इसे बढ़ाया जा सकता है - यह कक्षा की किसी भी अन्य विशेषता की तरह एक विशेषता है, और एक विधि से अलग नहीं होना चाहिए, एक विधि से अलग नहीं होना चाहिए। यह सुनिश्चित करने के लिए कि वे सुविधा का उपयोग कर ग्राहक के लक्ष्यों को पूरा करते हैं, सभी सुविधाओं को सावधानी से विचार किया जाना चाहिए। सुविधाओं को सुरक्षा समस्याओं, डीबग, दस्तावेज और रखरखाव के लिए डिज़ाइन, कार्यान्वित, समीक्षा की आवश्यकता है।
सभी लागतों और प्रयासों को आम तौर पर पैसे की व्यय की आवश्यकता होती है। आप किसके पैसे खर्च कर रहे हैं? उन्हें इस बात की राय हो सकती है कि आपको यह सुविधा करना चाहिए या नहीं।
1) पैसे खर्च ताकि आप विश्वास है कि यह सही मजबूत, सुरक्षित है और उपयोगकर्ता की जरूरतों को पूरा सुविधा करने के लिए:
असल में, आपके पास तीन विकल्प है।
2) उपर्युक्त में से कोई भी नहीं, लेकिन फिर भी सुविधा को शिप करें और उम्मीद है कि अज्ञात सुरक्षा जोखिमों के साथ एक अपरिचित, तेजी से कार्यान्वित, अवांछित, अनियंत्रित, अनपेक्षित सुविधा शिपिंग, आपके नियोक्ता या आपके ग्राहकों को नुकसान नहीं पहुंचाती है।
3) कक्षा को सील करें। बाद में इसे अनदेखा करें यदि आपको लगता है कि (1) सही विकल्प था।
मैं कहता हूं कि (3) पैसे के लिए अच्छा मूल्य है। मैं हमेशा लिखने वाली प्रत्येक कक्षा को सील करता हूं जिसे एक्स्टेंसिबिलिटी के लिए डिज़ाइन नहीं किया गया था।
एरिक, यहाँ आप के लिए एक सवाल है: पर एक नजर डालें।इससे पहले कि आप इसे ओवरराइड करने से पहले एक विधि 'आभासी' घोषित करना चाहते हैं, सी # ने कुछ ऐसा क्यों नहीं किया है जिससे संकेत मिलता है कि कक्षा को विरासत में प्राप्त किया जा सकता है और डिफ़ॉल्ट रूप से इसे सील कर सकता है। बस उत्सुक। – SolutionYogi
मैं इसे खरीदूंगा। क्या आपको विश्वास है कि सी # कक्षाओं को डिफ़ॉल्ट रूप से बंद कर दिया जाना चाहिए? –
@Daniel, @SolutionYogi: मेरी इच्छा है कि हमने ऐसा किया था। हालांकि, मैं वास्तव में अल्पसंख्यक में हूं; ऐसे बहुत से लोग हैं जो मानते हैं कि आपको केवल कक्षाओं को सील करना चाहिए जब आपके पास ऐसा करने का कोई कारण हो। मैं असहमत हूं; मुझे लगता है कि जब आपको ऐसा करने का कोई कारण होता है तो आपको केवल कक्षाओं को अनदेखा करना चाहिए। –
हां। यदि कुछ और नहीं है तो यह एक साइनपॉस्ट है जो दूसरों को यह बताता है कि उन्हें निशान से आगे नहीं जाना चाहिए।
sealed
होने के लिए कक्षा निर्धारित करना क्रूर नहीं है क्योंकि ऐसा करने से आपके कोड में सख्त नियम निर्धारित होता है: इस वर्ग को विरासत में नहीं मिला है।
कोड केवल क्रूर है यदि यह अनावश्यक और भ्रमित है।
यह कहा गया है कि, एक स्कूल विचार (और सरल नियम-अंगूठे) यह है कि आपको हमेशा सभी वर्गों को सील करना चाहिए क्योंकि यदि आवश्यक हो तो उन्हें अनदेखा करना आसान है लेकिन इसके विपरीत नहीं। कुछ कोड जनरेटर स्वचालित रूप से ऐसा करते हैं। (ऊपर एरिक लिपर्ट का विकल्प # 3 देखें। यह मूल रूप से वही बात कहता है।)
चीजों को कैसे करना है, इस बारे में लगभग हर उत्तर की तरह, यह निर्भर करता है। कुछ ऑप्टिमाइज़ेशन हैं जिन्हें डिफ़ॉल्ट रूप से कक्षाओं को सील करके प्राप्त किया जा सकता है और केवल आवश्यकता होने पर ही अनदेखा किया जा सकता है। http://msdn.microsoft.com/en-us/library/ms998547.aspx http://dotnetperls.com/sealed-1 – Firestrand
मैं इसे क्रूरता जोड़ने के लिए नहीं मानूंगा। इसके बजाय आप कक्षा के लिए अपने इरादे स्पष्ट रूप से व्यक्त कर रहे हैं।
कक्षाओं को विरासत के लिए डिज़ाइन किया जाना चाहिए या मुहरबंद होना चाहिए। दुर्भाग्यवश, सी # में डिफ़ॉल्ट रूप से कक्षाओं को सील नहीं किया जाता है, इसलिए आपको स्वयं को कीवर्ड शामिल करना होगा। व्यक्तिगत रूप से, मैं एक कीवर्ड को विरासत के लिए स्पष्ट रूप से कक्षाएं उपलब्ध कराने के लिए पसंद करता था क्योंकि इससे लोगों को कक्षा वर्ग के रूप में कक्षा का उपयोग करने से रोका जाएगा जब तक कि इसे स्पष्ट रूप से चिह्नित नहीं किया गया हो।
- 1. एनकोडुरि का कभी भी उपयोग किया जाना चाहिए?
- 2. मुझे खाली बेस क्लास कहां रखना चाहिए?
- 3. दबाएं "सभी के लिए कुछ भी नहीं किया जाना चाहिए"
- 4. शुद्ध बेस क्लास को डीएलएल से निर्यात किया जाना चाहिए?
- 5. उन समस्याओं को ढूंढें जिन्हें मुझे कभी सौंपा गया था
- 6. जहां स्काला में वर्गों का उपयोग नहीं किया जाना चाहिए?
- 7. मुझे "बेस :: *;" जैसे कुछ चाहिए
- 8. मुझे क्या करना चाहिए?
- 9. Azure में, मुझे भौतिक फाइलों को कहां स्टोर करना चाहिए जिन्हें वर्कर रोल द्वारा एक्सेस किया जाना चाहिए?
- 10. क्या मुझे के एंड आर में सभी अभ्यास करना चाहिए?
- 11. यदि मैंने कभी भी हैशसेट का उपयोग नहीं किया है, तो क्या मुझे अभी भी GetHashCode लागू करना चाहिए?
- 12. मुझे क्या gacutil.exe का उपयोग करना चाहिए?
- 13. क्या मुझे बेस वर्जन में सभी कार्यों को वर्चुअल घोषित करना चाहिए?
- 14. मुझे स्कैला की @inline एनोटेशन का उपयोग कब करना चाहिए (और मुझे नहीं चाहिए)?
- 15. मुझे _aligned_malloc() का उपयोग कब करना चाहिए?
- 16. क्या मुझे बूटस्ट्रैप का उपयोग करना चाहिए?
- 17. पायथन में, मुझे मेटा क्लास का उपयोग कब करना चाहिए?
- 18. क्या मुझे कभी भी अपने डब्ल्यूपीएफ ऐप में कचरा संग्रह को मजबूर करना चाहिए?
- 19. कारखानों को समझना और क्या मुझे उनका उपयोग करना चाहिए?
- 20. क्या मुझे मास्टर में विकसित विलय करना चाहिए और फिर टैगिंग के बाद वापस जाना चाहिए?
- 21. क्या मुझे इंटरफ़ेस निर्माता का उपयोग करना चाहिए या नहीं?
- 22. मुझे अपनी बेस क्लास विधि तक पहुंचने के लिए "उपयोग" कीवर्ड का उपयोग क्यों करना चाहिए?
- 23. मुझे अपने सीएसएस वर्गों को कैसे नामित करना चाहिए?
- 24. क्या मुझे प्रोटोटाइप का उपयोग करना चाहिए या नहीं?
- 25. मुझे वर्तमान संस्कृति या InvariantCulture कब निर्दिष्ट करना चाहिए और मुझे इसे कब निर्दिष्ट नहीं किया जाना चाहिए?
- 26. मुझे डोलॉल्स का उपयोग क्यों करना चाहिए?
- 27. क्या मुझे jQuery.each() का उपयोग करना चाहिए?
- 28. विधि को ओवरराइड किया जाना चाहिए लेकिन सार नहीं है?
- 29. मुझे पीएनजी का उपयोग क्यों करना चाहिए, न कि जेपीजी?
- 30. क्या मुझे HttpRuntime.Cache का उपयोग करना चाहिए?
[सोमोन ने कहा, और मैंने पढ़ा:] (http://programmers.stackexchange.com/a/210481/4261) कभी भी * एक वर्ग को सील न करें जब तक कि आपको पता न हो * आपके पास समर्थन समस्याएं होंगी आपके ग्राहक – cregox