क्या यह समान वस्तु उदाहरण की निजी विधि में सार्वजनिक विधि को कॉल करने के लिए एक कोड गंध है?
क्या यह समान वस्तु उदाहरण की निजी विधि में सार्वजनिक विधि को कॉल करने के लिए एक कोड गंध है?
जवाबों:
कोई बुरी गंध नहीं। इसकी आवश्यकता हो सकती है, आप इसे गलत होने पर संदेह क्यों करते हैं? परमाणु स्तर पर एक विधि एक स्वतंत्र इकाई है जो एक कार्य करती है। जब तक यह एक कार्य करता है, जिसके पास इसकी पहुंच है, वह इसे कार्य करने के लिए कह सकता है।
कोड गंध? हां, वास्तव में बुरा नहीं है, लेकिन एक अच्छा संकेतक है कि कक्षा में बहुत अधिक जिम्मेदारियां हो सकती हैं।
इसे एक संकेत के रूप में लें कि कक्षा को विभिन्न वस्तुओं में विभाजित करने की आवश्यकता हो सकती है, निजी तरीकों को वास्तव में एक ही वस्तु के सार्वजनिक तरीकों को कॉल करने की आवश्यकता नहीं होनी चाहिए, निश्चित रूप से एक साफ ओओ डिजाइन में।
बेशक, एक बार जब आप कक्षा का निरीक्षण कर लेते हैं और विधि कॉल के कारण स्पष्ट हो जाते हैं, तो यह पूरी तरह से उचित उपयोग हो सकता है, सामान्य तौर पर आप उम्मीद करेंगे कि कक्षा के लिए उपयोगिता के तरीके निजी हों, लेकिन यदि कोई पर्याप्त उपयोगी हो सार्वजनिक और अन्य तरीकों से उपयोग किया जा सकता है, मैं आमतौर पर उन तरीकों को भी सार्वजनिक करने की उम्मीद करता हूं।
जैसा कि सभी कोड से बदबू आती है, यह आगे के कोड निरीक्षण, तर्कसंगत बनाने और शायद रिफ्लेक्टर के लिए एक प्रेरणा है, लेकिन अलार्म का कारण नहीं है।
यह अप्रिय आश्चर्य का कारण बन सकता है यदि कोई व्यक्ति जो इस वर्ग के स्रोत कोड को नहीं पढ़ता है, वह इसे उप-वर्ग करने की कोशिश करता है और सार्वजनिक पद्धति को ओवरराइड करता है। चाहे वह वास्तविक चिंता है या नहीं यह स्पष्ट रूप से आपकी स्थिति पर निर्भर करता है। हो सकता है कि आपको सार्वजनिक विधि या यहां तक कि वर्ग के फाइनल में शामिल करने पर विचार करना चाहिए।
उस मामले में और क्या किया जाना चाहिए? निजी विधि को सार्वजनिक करें या सार्वजनिक विधि को निजी बनाएं? कॉपी-कोड को सार्वजनिक विधि से निजी एक में पेस्ट करें?
नहीं , यहां कोई बदबू नहीं है।
यदि हम सूची के साथ एक कतार के इंटरफ़ेस को लागू करते हैं, तो क्या आसानी से कतार के कार्यान्वयन को प्राप्त करने के लिए उचित सूची कार्यों को कॉल करना एक बुरी गंध है?
अगर आपके पास कुछ है और आप इसे किसी और चीज़ में बदलना चाहते हैं (जैसे रैपर) तो इसकी ख़ुशबू नहीं है, इसका कोड डिज़ाइन पैटर्न के साथ री-यूज़ेबिलिटी फंक्शन लेवल में काम करता है (क्या यह फंक्शन एक ऑब्जेक्ट है?)
मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन यह कुछ ऐसा है जिस पर मैं काम कर रहा हूं। मैं इसे एक कोड गंध मानता हूं, और समझ नहीं सकता कि आप ऐसा क्यों करना चाहते हैं। यदि किसी निजी विधि को सार्वजनिक विधि को कॉल करना चाहिए, तो सार्वजनिक विधि की सामग्री को एक निजी पद्धति में लिया और रखा जाना चाहिए, जिसे दोनों विधियों को फिर से कॉल किया जा सकता है। क्यूं कर?
सार्वजनिक पद्धति में ऐसे परीक्षण हो सकते हैं जो आंतरिक रूप से आपके निष्पादन कोड के बाद आवश्यक नहीं हैं। यह एक UserObj प्राप्त कर सकता है और उदाहरण के लिए उपयोगकर्ता अनुमतियों का परीक्षण करना चाहता है।
सार्वजनिक कॉल के बाद, आपको ऑब्जेक्ट को लॉक करने की आवश्यकता हो सकती है, यदि आप थ्रेडिंग का उपयोग कर रहे हैं, तो आंतरिक रूप से, आप किसी सार्वजनिक विधि से वापस कॉल नहीं करना चाहेंगे।
मेरी राय में परिपत्र त्रुटियों और अनंत छोरों और यादगार अपवादों से बाहर आने की अधिक संभावना है।
सादा और सरल, बुरा डिजाइन और "आलसी"। सार्वजनिक विधियाँ बाहरी दुनिया तक पहुँच प्रदान करती हैं। जब आप पहले से ही अंदर हों तो बाहर घूमने का कोई कारण नहीं है।
इसके विपरीत कल्पना कीजिए। आप एक निजी विधि में हैं और आपको सार्वजनिक विधि में कार्यक्षमता की आवश्यकता है यदि आप उस सार्वजनिक विधि को निजी से कॉल नहीं कर सकते हैं । तुम क्या करोगे?
इसका उत्तर स्पष्ट रूप से है कि जब आप किसी सार्वजनिक विधि में कार्यक्षमता चाहते हैं तो आपको इस विधि को इस वर्ग के तरीकों से या अन्य कक्षाओं से कॉल करने में सक्षम होना चाहिए।
अपने कोड में मैं अक्सर आलसी लोड गेटर्स बनाता हूं, जो यह कहता है कि ऑब्जेक्ट पहली बार अनुरोध किए जाने पर आरंभीकृत हो जाता है और उसके बाद उसी त्वरित ऑब्जेक्ट का पुन: उपयोग करता है। हालाँकि, एक आलसी लोड का उपयोग कर एक वस्तु का तात्पर्य है कि यह किसी भी बिंदु पर तत्काल आवश्यक नहीं हो सकता है। कॉल के अनुक्रम के चारों ओर मेरे सिर को लपेटने के बजाय, मुझे पता है कि वह वस्तु पहले से ही तात्कालिक है या एक अन्य विधि के अंदर एक आलसी लोड के समान कोड को दोहराते हुए, मैं बस आलसी लोडर को कॉल करता हूं जब भी मुझे उस वस्तु की आवश्यकता होती है।
जिस तरह आप सार्वजनिक तरीकों का इस्तेमाल स्मार्ट तरीके से कर सकते हैं, उसी तरह आप गलत तरीके से भी उनका इस्तेमाल कर सकते हैं। इसका एक उदाहरण एक सार्वजनिक विधि हो सकती है जो किसी अन्य निजी विधि को कॉल करने से पहले अपने मापदंडों को संसाधित करती है। उस सार्वजनिक पद्धति को आकस्मिक रूप से कॉल करना एक गलती होगी क्योंकि आपके पास समान पैरामीटर हैं। गलती सूक्ष्म है लेकिन यह किसी अन्य चीज़ से अधिक एक डिज़ाइन त्रुटि है और इसके लिए आवश्यक है कि आप सार्वजनिक विधि के मापदंडों के बजाय आंतरिक विधि के मापदंडों के साथ प्रबंधन करना सीखें।
तो अपने प्रश्न का उत्तर देने के लिए, यह निश्चित रूप से बुरा कोड नहीं है यदि आप इसे सही तरीके से उपयोग करते हैं।
प्रश्न आपको अपने आप से पूछने की आवश्यकता है कि आपकी कक्षा को आपकी कक्षा के ग्राहकों की समान आवश्यकता क्यों है? आमतौर पर एक वर्ग को अपने ग्राहकों से बहुत अलग जरूरत होती है। तो हाँ, यह एक संकेत है कि आपके पास या तो है
(ए) सार्वजनिक रूप से कुछ उजागर किया जो निजी होना चाहिए; या
(बी) वर्ग का व्यवहार पर्याप्त संकीर्ण नहीं है (एकल जिम्मेदारी सिद्धांत पर विचार करें)।