क्या मुझे उस स्थिति से निपटने की ज़रूरत है जहां प्रतिबिंब के माध्यम से निजी तरीकों को बुलाया जाता है?


12

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

उदाहरण के लिए, यदि कोई निजी विधि यह private DoSomething(int number)अपेक्षा करती है:

  • number एक सकारात्मक गैर-शून्य पूर्णांक है, और:
  • एक निजी चर string abcशून्य नहीं है और एक खाली स्ट्रिंग नहीं है,

और पूरी तरह से, बदसूरत विफल रहता है यदि उन दो स्थितियों का मिलान नहीं किया जाता है, तो क्या मुझे उन विफलताओं को संभालना चाहिए, भले ही मुझे पता हो कि कक्षा में सभी तरीके हमेशा कॉल करने से पहले एक गैर-रिक्त मान असाइन करेंगे , और इसके लिए एक सकारात्मक गैर-शून्य पूर्णांक पास करेंगे तरीका?abcDoSomething

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

नोट: मेरा प्रश्न केवल पुस्तकालयों के एक मानक सेट को शामिल करता है। यह कोड को कवर नहीं करता है जो अत्यधिक सुरक्षित होना चाहिए (यानी जब कोई व्यक्ति अप्रत्याशित रूप से या दुर्घटना का व्यवहार करने के लिए प्रतिबिंब का उपयोग करके दिलचस्पी ले सकता है)।


¹ क्योंकि वर्ग सही ढंग से प्रलेखित है, क्योंकि यह सुनिश्चित करने के लिए पर्याप्त इकाई परीक्षण हैं कि कोई अन्य डेवलपर इस पद्धति को नहीं तोड़ देगा, आदि।


क्या व्युत्पन्न वर्ग निजी तरीकों को कॉल करने में सक्षम होंगे?
oenone

जवाबों:


16

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

यही समस्या अन्य भाषाओं जैसे C ++ के साथ भी हो सकती है, जहाँ मैंने चीजों को देखा

#define private public

सारांश में - आपको इन स्थितियों से निपटने के लिए आवश्यक नहीं है, कॉलर को बेहतर पता होना चाहिए।


3
मैंने लोगों को कक्षाएं (अहस्ताक्षरित चार *) डाली हैं, और वे उस सदस्य चर की मेमोरी ऑफसेट पर सीधे लिखते हैं जिसे वे बदलना चाहते हैं। मेरी आँखें फटी की फटी रह गईं।
शॉन डी।

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

5

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

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


0

वैसे, गैर-स्थानीय चरों को मान्य करने से पहले, उनका उपयोग करना हमेशा एक अच्छा विचार है, लेकिन इसके अलावा मैं इसके बारे में चिंता नहीं करता। जैसा कि दूसरों ने कहा, आपने पहली बार विधि को निजी बनाकर अपने इरादे स्थापित किए हैं; आपकी कक्षा के बाहर से किसी को भी कॉल करने की गारंटी शून्य है। जावा में काम करते समय, मैंने अपने निजी तरीकों पर javadoc टिप्पणियां भी नहीं डालीं, क्योंकि मैं नहीं चाहता कि अन्य डेवलपर्स को भी पता चले कि वे वहां हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.