मुझे यह कहकर प्रस्तावना दें कि मैं मुख्य रूप से यहां विधि अभिगम के बारे में बात कर रहा हूं, और कुछ हद तक, अंतिम रूप से अंकन करना, न कि सदस्य अभिगम।
पुराना ज्ञान
"इसे निजी चिह्नित करें जब तक कि आपके पास एक अच्छा कारण न हो"
उन दिनों में समझ में आया जब इसे लिखा गया था, इससे पहले कि खुला स्रोत डेवलपर लाइब्रेरी स्पेस और VCS / निर्भरता mgmt पर हावी हो। गितुब, मावेन आदि के लिए हाइपर सहयोगी धन्यवाद बन गया, फिर उस रास्ते (एस) को बाधित करने के लिए भी पैसा था, जिसमें एक पुस्तकालय का उपयोग किया जा सकता था। मैंने अपने करियर के पहले 8 या 9 साल शायद इस "सर्वश्रेष्ठ अभ्यास" का सख्ती से पालन करने में बिताए।
आज, मैं इसे बुरी सलाह मानता हूं। कभी-कभी एक विधि निजी, या एक वर्ग के फाइनल को चिह्नित करने के लिए एक उचित तर्क है, लेकिन यह बहुत दुर्लभ है, और तब भी यह शायद कुछ भी सुधार नहीं कर रहा है।
क्या आपने कभी:
- एक पुस्तकालय आदि से निराश, आश्चर्यचकित या आहत हुए, जिसमें बग था जो विरासत और कोड की कुछ पंक्तियों के साथ तय किया जा सकता था, लेकिन निजी / अंतिम तरीकों और कक्षाओं के कारण एक आधिकारिक पैच के लिए इंतजार करने के लिए मजबूर किया गया था जो कभी नहीं आ सकता है? मेरे पास है।
- लेखकों द्वारा कल्पना की तुलना में थोड़ा अलग उपयोग के मामले में एक पुस्तकालय का उपयोग करना चाहते थे, लेकिन निजी / अंतिम तरीकों और कक्षाओं के कारण ऐसा करने में असमर्थ थे? मेरे पास है।
- एक पुस्तकालय आदि से निराश, आश्चर्यचकित या आहत हो गया, जो इसकी अत्यधिकता में पारंगत था? मेरे पास नही है।
ये तीन सबसे बड़ी युक्तियां हैं जिन्हें मैंने डिफ़ॉल्ट रूप से निजी तरीकों को चिह्नित करने के लिए सुना है:
युक्तिकरण # 1: यह असुरक्षित है और किसी विशिष्ट विधि को ओवरराइड करने का कोई कारण नहीं है
मैं इस बात की गिनती नहीं कर सकता कि मैं इस बारे में गलत हूं कि मेरे द्वारा लिखे गए किसी विशिष्ट तरीके को ओवरराइड करने की आवश्यकता होगी या नहीं। कई लोकप्रिय ओपन सोर्स लिबास पर काम करने के बाद, मैंने चीजों को निजी तौर पर चिह्नित करने की सही लागत को सीखा। यह अक्सर अप्रत्याशित समस्याओं या मामलों का उपयोग करने के लिए एकमात्र व्यावहारिक समाधान को समाप्त करता है। इसके विपरीत, मैंने कभी भी 16+ वर्षों में व्यावसायिक विकास नहीं किया है जो एपीआई सुरक्षा से संबंधित कारणों के लिए निजी के बजाय संरक्षित विधि को चिह्नित करता है। जब एक डेवलपर एक वर्ग का विस्तार करने और एक विधि को ओवरराइड करने का विकल्प चुनता है, तो वे सचेत रूप से कह रहे हैं "मुझे पता है कि मैं क्या कर रहा हूं।" और उत्पादकता के लिए जो पर्याप्त होना चाहिए। अवधि। यदि यह खतरनाक है, तो इसे क्लास / मेथड Javadocs में नोट करें, बस दरवाज़ा बंद करके आँख बंद करके न करें।
डिफ़ॉल्ट रूप से संरक्षित तरीके चिह्नित करना आधुनिक एसडब्ल्यू विकास में प्रमुख मुद्दों में से एक के लिए एक शमन है: कल्पना की विफलता।
युक्तिकरण # 2: यह सार्वजनिक API / Javadocs को साफ रखता है
यह एक अधिक उचित है, और लक्षित दर्शकों पर निर्भर करता है कि यह सही काम भी हो सकता है, लेकिन यह विचार करने लायक है कि वास्तव में एपीआई "स्वच्छ" रखने की लागत क्या है: एक्स्टेंसिबिलिटी। ऊपर वर्णित कारणों के लिए, यह संभवतया डिफ़ॉल्ट रूप से संरक्षित चीजों को केवल मामले में चिह्नित करने के लिए अधिक समझ में आता है।
युक्तिकरण # 3: मेरा सॉफ्टवेयर वाणिज्यिक है और मुझे इसका उपयोग प्रतिबंधित करने की आवश्यकता है।
यह उचित भी है, लेकिन एक उपभोक्ता के रूप में मैं हर बार कम प्रतिबंधक प्रतियोगी (कोई महत्वपूर्ण गुणवत्ता अंतर मौजूद नहीं है) के साथ जाऊंगा।
नेवर से नेवर
मैं यह नहीं कह रहा हूं कि तरीकों को कभी भी निजी न रखें। मैं कह रहा हूं कि अंगूठे का बेहतर नियम है "जब तक कोई अच्छा कारण न हो, तब तक तरीकों को संरक्षित रखें"।
यह सलाह उन पुस्तकालयों या बड़े पैमाने पर परियोजनाओं पर काम करने वालों के लिए सबसे उपयुक्त है जिन्हें मॉड्यूल में तोड़ा गया है। छोटी या अधिक अखंड परियोजनाओं के लिए यह उतना मायने नहीं रखता है, जितना कि आप वैसे भी सभी कोड को नियंत्रित करते हैं और यदि आपके पास आवश्यकता होती है, तो अपने कोड के एक्सेस स्तर को बदलना आसान है। हालांकि तब भी, मैं अभी भी वही सलाह दूंगा :-)