2010-01-29 7 views
43

क्या मुझे उन सभी वर्गों को सील करना चाहिए जिन्हें मुझे कभी भी बेस क्लास के रूप में उपयोग नहीं किया जाना चाहिए, भले ही कोई ठोस प्रदर्शन या सुरक्षा चिंता न हो, या क्या यह केवल क्रूरता जोड़ रहा है?क्या मुझे उन सभी वर्गों को सील करना चाहिए जिन्हें मुझे पता है कि कभी भी बेस क्लास के रूप में उपयोग नहीं किया जाना चाहिए?

+0

[सोमोन ने कहा, और मैंने पढ़ा:] (http://programmers.stackexchange.com/a/210481/4261) कभी भी * एक वर्ग को सील न करें जब तक कि आपको पता न हो * आपके पास समर्थन समस्याएं होंगी आपके ग्राहक – cregox

उत्तर

44

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

सभी लागतों और प्रयासों को आम तौर पर पैसे की व्यय की आवश्यकता होती है। आप किसके पैसे खर्च कर रहे हैं? उन्हें इस बात की राय हो सकती है कि आपको यह सुविधा करना चाहिए या नहीं।

1) पैसे खर्च ताकि आप विश्वास है कि यह सही मजबूत, सुरक्षित है और उपयोगकर्ता की जरूरतों को पूरा सुविधा करने के लिए:

असल में, आपके पास तीन विकल्प है।

2) उपर्युक्त में से कोई भी नहीं, लेकिन फिर भी सुविधा को शिप करें और उम्मीद है कि अज्ञात सुरक्षा जोखिमों के साथ एक अपरिचित, तेजी से कार्यान्वित, अवांछित, अनियंत्रित, अनपेक्षित सुविधा शिपिंग, आपके नियोक्ता या आपके ग्राहकों को नुकसान नहीं पहुंचाती है।

3) कक्षा को सील करें। बाद में इसे अनदेखा करें यदि आपको लगता है कि (1) सही विकल्प था।

मैं कहता हूं कि (3) पैसे के लिए अच्छा मूल्य है। मैं हमेशा लिखने वाली प्रत्येक कक्षा को सील करता हूं जिसे एक्स्टेंसिबिलिटी के लिए डिज़ाइन नहीं किया गया था।

+4

एरिक, यहाँ आप के लिए एक सवाल है: पर एक नजर डालें।इससे पहले कि आप इसे ओवरराइड करने से पहले एक विधि 'आभासी' घोषित करना चाहते हैं, सी # ने कुछ ऐसा क्यों नहीं किया है जिससे संकेत मिलता है कि कक्षा को विरासत में प्राप्त किया जा सकता है और डिफ़ॉल्ट रूप से इसे सील कर सकता है। बस उत्सुक। – SolutionYogi

+0

मैं इसे खरीदूंगा। क्या आपको विश्वास है कि सी # कक्षाओं को डिफ़ॉल्ट रूप से बंद कर दिया जाना चाहिए? –

+14

@Daniel, @SolutionYogi: मेरी इच्छा है कि हमने ऐसा किया था। हालांकि, मैं वास्तव में अल्पसंख्यक में हूं; ऐसे बहुत से लोग हैं जो मानते हैं कि आपको केवल कक्षाओं को सील करना चाहिए जब आपके पास ऐसा करने का कोई कारण हो। मैं असहमत हूं; मुझे लगता है कि जब आपको ऐसा करने का कोई कारण होता है तो आपको केवल कक्षाओं को अनदेखा करना चाहिए। –

5

हां। यदि कुछ और नहीं है तो यह एक साइनपॉस्ट है जो दूसरों को यह बताता है कि उन्हें निशान से आगे नहीं जाना चाहिए।

10

sealed होने के लिए कक्षा निर्धारित करना क्रूर नहीं है क्योंकि ऐसा करने से आपके कोड में सख्त नियम निर्धारित होता है: इस वर्ग को विरासत में नहीं मिला है।

कोड केवल क्रूर है यदि यह अनावश्यक और भ्रमित है।

यह कहा गया है कि, एक स्कूल विचार (और सरल नियम-अंगूठे) यह है कि आपको हमेशा सभी वर्गों को सील करना चाहिए क्योंकि यदि आवश्यक हो तो उन्हें अनदेखा करना आसान है लेकिन इसके विपरीत नहीं। कुछ कोड जनरेटर स्वचालित रूप से ऐसा करते हैं। (ऊपर एरिक लिपर्ट का विकल्प # 3 देखें। यह मूल रूप से वही बात कहता है।)

+1

चीजों को कैसे करना है, इस बारे में लगभग हर उत्तर की तरह, यह निर्भर करता है। कुछ ऑप्टिमाइज़ेशन हैं जिन्हें डिफ़ॉल्ट रूप से कक्षाओं को सील करके प्राप्त किया जा सकता है और केवल आवश्यकता होने पर ही अनदेखा किया जा सकता है। http://msdn.microsoft.com/en-us/library/ms998547.aspx http://dotnetperls.com/sealed-1 – Firestrand

7

मैं इसे क्रूरता जोड़ने के लिए नहीं मानूंगा। इसके बजाय आप कक्षा के लिए अपने इरादे स्पष्ट रूप से व्यक्त कर रहे हैं।

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

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