24

मैं StringTokenizer.java कक्षा की जांच कर रहा था और कुछ प्रश्न थे जो दिमाग में आए थे।सार्वजनिक तरीकों से निजी तरीके

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

मैं समझता हूं कि उन क्षेत्रों में अवैध मूल्यों को संग्रहीत करने के लिए फ़ील्ड को निजी बनाना महत्वपूर्ण है (केवल कई कारणों में से एक)। हालांकि, जब निजी तरीकों की बात आती है, तो मुझे यकीन नहीं है कि वे क्यों महत्वपूर्ण हैं।

उदाहरण के लिए, StringTokenizer कक्षा के मामले में, क्या हमने सार्वजनिक विधियों के भीतर सभी कार्यान्वयन कोड को नहीं रखा है? इन तरीकों के लिए एपीआई के बाद इन तरीकों का उपयोग करने वाले वर्गों में इससे कोई फर्क कैसे पड़ता है (यानी इन सार्वजनिक तरीकों को कॉल करने के नियम) वही रहेगा? एकमात्र कारण मैं सोच सकता हूं कि क्यों निजी तरीके उपयोगी हैं क्योंकि यह आपको डुप्लिकेट कोड लिखने में मदद करता है। उदाहरण के लिए, यदि सभी सार्वजनिक तरीकों ने एक ही काम किया है, तो आप एक निजी विधि घोषित कर सकते हैं जो यह कार्य करता है और जिसका उपयोग सार्वजनिक तरीकों से किया जा सकता है।

अन्य प्रश्न, सार्वजनिक विधि के विपरीत निजी विधि में कार्यान्वयन लिखने का क्या फायदा है?

public class Sum{ 

    private int sum(int a, int b){ 
     return a+b; 
    } 

    public int getSum(int a, int b){ 
     return sum(a,b); 
    } 
} 

बनाम ...

public class Sum{ 

    public int getSum(int a, int b){ 
     return a+b; 
    } 
} 

कैसे पहला नमूना अधिक फायदेमंद है:

यहाँ एक छोटा सा उदाहरण है?

उत्तर

28

कुछ जोड़ने के लिए, एक निजी विधि हमेशा सुरक्षित रूप से बदला जा सकता है, क्योंकि आप निश्चित रूप से जानते हैं कि केवल अपनी कक्षा से ही कहा जाता है, कोई बाहरी कक्षाएं निजी विधि को कॉल करने में सक्षम नहीं होती हैं (वे भी नहीं देख सकते यह)।

इसलिए एक निजी विधि हमेशा अच्छी होती है क्योंकि आपको पता है कि इसे बदलने के बारे में कोई समस्या नहीं है, यहां तक ​​कि आप विधि में अधिक पैरामीटर सुरक्षित रूप से जोड़ सकते हैं।

अब सार्वजनिक विधि के बारे में सोचें, कोई भी उस विधि को कॉल कर सकता है, इसलिए यदि आप पैरामीटर जोड़ते/हटाते हैं, तो आपको उस विधि में सभी कॉल भी बदलनी होगी।

+1

मुझे आपका अंक नहीं मिला। अगर मुझे कुछ याद आ रहा है तो मुझे माफ़ कर दो। मैं आपसे कहता हूं: "इसलिए एक निजी विधि हमेशा अच्छी होती है क्योंकि आप जानते हैं कि इसे बदलने के बारे में कोई समस्या नहीं है, यहां तक ​​कि आप विधि में सुरक्षित रूप से अधिक पैरामीटर जोड़ सकते हैं"। लेकिन आप क्लाइंट का सामना करने वाली सार्वजनिक एपीआई अभी भी वही है। इसलिए आप एक सार्वजनिक विधि के अंदर सभी तर्क लिखते हैं या इसके अंदर एक फ़ंक्शन को कॉल करते हैं या जो भी ग्राहक सार्वजनिक एपीआई को देखता है वह किसी भी अंतर को पर्यवेक्षक नहीं करता है। कार्यान्वयन के अंदर कोड अभी भी किसी भी समय बदला जा सकता है जो निजी समारोह के अनुबंध/कार्यान्वयन में परिवर्तन करने के रूप में अच्छा है – Saurabh

+0

@saury इस विशेष मामले में, हाँ, यह वही एपीआई है, लेकिन फिर भी आपने इसकी गारंटी नहीं दी है भविष्य में इसे रखने वाला है। अपने अनुभव से मैं आपको सलाह देता हूं कि "ओह, आइए इसे सीधे सार्वजनिक करें और, अगर भविष्य में हमें इसे निजी की जरूरत है, तो हम इसे बदल देंगे" क्या हो रहा है यह है कि ऐसी विधियां कभी निजी नहीं होतीं, इसलिए यह शुरुआत में एक विशाल रिफैक्टर करने के बजाय शुरुआत में थोड़ा अधिक आर्किटेक्चर होना बेहतर है। –

+0

यदि कोई सार्वजनिक विधि उस निजी विधि को कॉल करती है जिसे आपने "बिना किसी समस्या के" बदला है, तो क्या सार्वजनिक विधि किसी भी तरह से टूट नहीं जाएगी? यदि हां, तो कुछ भी "सुरक्षित रूप से बदलना" में वास्तव में कोई अंतर नहीं है; जो भी आप बदलते हैं उसका परीक्षण किया जाना चाहिए - इसे सार्वजनिक/निजी बनाना आपको इस मामले में कोई अतिरिक्त सुरक्षा नहीं देगा। – gented

2

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

डुप्लिकेट कोड को समेकित करने के अतिरिक्त (अक्सर "स्वयं को दोहराना न करें" या "DRY" के रूप में व्यक्त किया जाता है), निजी तरीकों का उपयोग करने से आप अपने कोड को संरचना और दस्तावेज करने में भी मदद कर सकते हैं। यदि आप स्वयं को लेखन विधि पाते हैं जो कई चीजें करता है, तो आप इसे कई निजी तरीकों से विभाजित करने पर विचार करना चाहेंगे। ऐसा करने से यह स्पष्ट हो सकता है कि तर्क के प्रत्येक टुकड़े के लिए इनपुट और आउटपुट क्या हैं (एक बेहतर ग्रैन्युलरिटी पर)। इसके अतिरिक्त, वर्णनात्मक विधि नाम पूरक कोड प्रलेखन में मदद कर सकते हैं।

+1

हां, मैं इस पर आपसे सहमत हूं।सवाल मैं पूछने का प्रयास कर रहा हूं कि, सार्वजनिक विधि की तुलना में एक निजी विधि में कार्यान्वयन कोड लिखना फायदेमंद क्यों है? अगर हम सार्वजनिक विधि के अंदर सभी कोड रखना चाहते थे, तो इससे क्या अंतर आएगा? अनिवार्य रूप से, हम अभी भी सार्वजनिक पद्धति को उसी तरह बुला रहे हैं और हम अभी भी इसे पहले के समान परिणाम वापस करने की उम्मीद कर रहे हैं। – kpatelio

+3

@ user600194 कोड रखना निजी छुपा कार्यान्वयन विवरण और एपीआई उपभोक्ताओं को बाधित किए बिना कार्यान्वयन को बदलने की अनुमति देता है। छिपाने/encapsulation का स्तर अक्सर मनमाने ढंग से (और कभी-कभी capricious) है। –

0

बनाना कार्यों निजी आपको निम्नलिखित परिस्थितियों में लाभ देता है:

  1. समारोह को निजी बनाना तो वर्ग दाय है और आप का विस्तार JVM संकलक समारोह इनलाइन करने और इसलिए ऊपर बढ़ाने आवेदन प्रदर्शन
  2. का विकल्प देता है यह एक बच्चे वर्ग से, तो यदि आप बाल वर्ग से कार्यों को छिपाना चाहते हैं तो आप यह कर सकते हैं (आप स्ट्रिंगटोकनाइज़र का विस्तार कर सकते हैं)।
  3. कोड का एक टुकड़ा से अधिक फ़ंक्शन में प्रयोग की जाने वाली है, तो आप निजी उपयोगिता विधि में उस कोड को स्थानांतरित
+0

आपका # 3 निजी का * लाभ * नहीं है; साझा कोड या तो सार्वजनिक या निजी हो सकता है। –

+0

ठीक है, मेरे बिंदु को आगे बताने के लिए कहें कि आपके पास एल्गोरिदम कार्यान्वयन कार्यों (सभी सार्वजनिक) का एक सेट है। अब यदि आपके अलग-अलग एपीआई को दो संख्याओं के वर्ग के वर्ग के वर्ग-रूट की गणना करने की आवश्यकता है, तो यह तर्क एक निजी फ़ंक्शन में स्थानांतरित करने के लिए बेहतर है जो दो संख्याओं को इनपुट के रूप में लेता है। इस तरह के एक समारोह को सार्वजनिक बनाना ज्यादा समझ में नहीं आता है क्योंकि आपकी कक्षा एल्गोरिदमिक समस्याओं के विभिन्न लीग का समाधान प्रदान कर रही है। इस तरह के एक समारोह पबिक बनाना उस वर्ग की परिभाषा को हराने सकता है। – Saurabh

1

जब जावा में स्वच्छ कोड या किसी अन्य वस्तु उन्मुख भाषा, सामान्य साफ सबसे पठनीय लेखन में कोड में संक्षिप्त संक्षिप्त विधियां होती हैं। यह अक्सर आता है कि कोड क्लीनर और अधिक रखरखाव करने के लिए एक विधि के भीतर तर्क अलग विधि कॉल में बेहतर व्यक्त किया जा सकता है।

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

निजी तरीकों के साथ हम उस तर्क को छिपाने में सक्षम हैं जो वर्ग के बाहर कहीं से भी पहुंच योग्य नहीं है और नहीं।

1

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

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

0

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

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

1

एक विधि निजी घोषित करने का उद्देश्य है

छिपाने कार्यान्वयन विवरण के लिए
  • सार्वजनिक एपीआई के रूप में सूचीबद्ध होने से विधि को बाहर
  • कोड के पीछे तर्क/नहीं किया जाता है बाहर से दुरुपयोग सुनिश्चित करें
  • अधिकांश समय आपकी विधि का निष्पादन अन्य विधियों पर निर्भर करता है जो इससे पहले चल रहा है; तो आप यह भी सुनिश्चित करें कि आप अपने तरीकों के लिए निजी अपने विधि

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

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