खासकर निजी सदस्यों पर चिंतन गलत है
- प्रतिबिंब प्रकार सुरक्षा को तोड़ता है। आप एक ऐसी विधि को लागू करने की कोशिश कर सकते हैं जो मौजूद नहीं है (अब), या गलत मापदंडों के साथ, या बहुत अधिक मापदंडों के साथ, या पर्याप्त नहीं ... या गलत क्रम में भी (यह मेरा पसंदीदा :))। वैसे वापसी का प्रकार भी बदल सकता है।
- परावर्तन धीमा है।
निजी सदस्य प्रतिबिंब एनकैप्सुलेशन सिद्धांत को तोड़ते हैं और इस प्रकार अपने कोड को निम्न में उजागर करते हैं:
- अपने कोड की जटिलता बढ़ाएं क्योंकि इसमें कक्षाओं के आंतरिक व्यवहार को संभालना है। जो छिपा है, वह छिपा रहना चाहिए।
- अपने कोड को तोड़ने के लिए आसान बनाता है क्योंकि यह संकलन करेगा, लेकिन अगर इसका नाम बदल नहीं गया तो यह नहीं चलेगा।
- निजी कोड को तोड़ने के लिए आसान बनाता है क्योंकि अगर यह निजी है तो इसे उस तरह से बुलाया जाना नहीं है। हो सकता है कि निजी पद्धति कुछ आंतरिक अवस्था की अपेक्षा करती है जिसे कहा जाता है।
क्या होगा अगर मैं इसे वैसे भी करना चाहिए?
ऐसे मामले हैं, जब आप किसी तीसरे पक्ष पर निर्भर होते हैं या आपको कुछ एपीआई उजागर नहीं करने की आवश्यकता होती है, तो आपको कुछ प्रतिबिंब बनाने होंगे। कुछ इसका इस्तेमाल कुछ वर्गों के परीक्षण के लिए भी करते हैं, लेकिन वे केवल आंतरिक सदस्यों को परीक्षण के लिए पहुँच देने के लिए इंटरफ़ेस को बदलना नहीं चाहते हैं।
यदि आप इसे करते हैं, तो इसे सही करें
- तोड़ने के लिए आसान मिटेट्रेट करें:
आसान ब्रेक इश्यू को कम करने के लिए, यूनिट परीक्षणों में परीक्षण द्वारा किसी भी संभावित ब्रेक का पता लगाना सबसे अच्छा है जो एक निरंतर एकीकरण बिल्ड या इस तरह से चलेगा। बेशक, इसका मतलब है कि आप हमेशा एक ही विधानसभा (जिसमें निजी सदस्य होते हैं) का उपयोग करते हैं। यदि आप एक गतिशील लोड और प्रतिबिंब का उपयोग करते हैं, तो आप आग से खेलना पसंद करते हैं, लेकिन आप हमेशा उस अपवाद को पकड़ सकते हैं जो कॉल का उत्पादन कर सकता है।
- प्रतिबिंब की सुस्ती को कम करें:
.Net फ्रेमवर्क के हाल के संस्करणों में, CreateDelegate ने एक कारक 50 से हराया। MethodInfo इनवोक:
// The following should be done once since this does some reflection
var method = this.GetType().GetMethod("Draw_" + itemType,
BindingFlags.NonPublic | BindingFlags.Instance);
// Here we create a Func that targets the instance of type which has the
// Draw_ItemType method
var draw = (Func<TInput, Output[]>)_method.CreateDelegate(
typeof(Func<TInput, TOutput[]>), this);
draw
मानक के रूप में MethodInfo.Invoke
उपयोग की तुलना में कॉल लगभग 50x तेज होगी :draw
Func
var res = draw(methodParams);
विभिन्न विधि चालान पर बेंचमार्क देखने के लिए मेरी इस पोस्ट को देखें