বিশেষত ব্যক্তিগত সদস্যদের প্রতিফলন ভুল
- প্রতিবিম্ব বিরতি ধরনের সুরক্ষা। আপনি এমন একটি পদ্ধতিতে চেষ্টা করতে পারেন যা বিদ্যমান নেই (অন্যটি), বা ভুল পরামিতিগুলি সহ, বা খুব বেশি পরামিতি সহ, বা যথেষ্ট নয় ... বা এমনকি ভুল ক্রমেও (এটি আমার প্রিয় :))। উপায় দ্বারা রিটার্নের ধরণটিও পরিবর্তিত হতে পারে।
- প্রতিবিম্ব ধীর।
ব্যক্তিগত সদস্যদের প্রতিচ্ছবি এনক্যাপসুলেশন নীতিটি ভেঙে দেয় এবং এইভাবে আপনার কোডটি নিম্নলিখিতটিতে প্রকাশ করে:
- আপনার কোডের জটিলতা বাড়ান কারণ এটি ক্লাসগুলির অভ্যন্তরীণ আচরণ পরিচালনা করতে হয়। যা গোপন তা লুকিয়ে রাখা উচিত।
- আপনার কোডটিকে ভাঙ্গা সহজ করে তোলে কারণ এটি সংকলিত হবে তবে পদ্ধতিটি এর নাম পরিবর্তন করলে চলবে না।
- প্রাইভেট কোডটিকে ভাঙ্গা সহজ করে তোলে কারণ এটি ব্যক্তিগত থাকলে এটি সেভাবে কল করার উদ্দেশ্যে নয়। সম্ভবত ব্যক্তিগত পদ্ধতি কল করার আগে কিছু অভ্যন্তরীণ অবস্থা আশা করে।
আমি যদি যাইহোক এটি করা আবশ্যক?
এমন কেসগুলি রয়েছে, যখন আপনি কোনও তৃতীয় পক্ষের উপর নির্ভর করেন বা আপনার কিছু এপিআই উন্মুক্ত না করা দরকার হয়, আপনাকে কিছু প্রতিবিম্ব করতে হবে। কেউ কেউ নিজের মালিকানাধীন কিছু ক্লাস পরীক্ষা করার জন্য এটি ব্যবহার করে তবে তারা কেবল পরীক্ষার জন্য অভ্যন্তরীণ সদস্যদের অ্যাক্সেস দেওয়ার জন্য ইন্টারফেসটি পরিবর্তন করতে চান না।
আপনি যদি এটি করেন তবে এটি সঠিকভাবে করুন
ইস্যুতে ভাঙ্গা সহজ সমাধানের জন্য, ইউনিট পরীক্ষায় যা কোনও ধারাবাহিক ইন্টিগ্রেশন বিল্ড বা এ জাতীয় চলতে পারে সেগুলি পরীক্ষা করে কোনও সম্ভাব্য বিরতি সনাক্ত করা ভাল। অবশ্যই, এর অর্থ হল আপনি সর্বদা একই সমাবেশটি ব্যবহার করেন (এতে ব্যক্তিগত সদস্য রয়েছে)। আপনি যদি একটি গতিশীল লোড এবং প্রতিবিম্ব ব্যবহার করেন তবে আপনি আগুনের সাথে খেলতে পছন্দ করেন তবে কলটি যে ব্যতিক্রম করতে পারে তা আপনি সর্বদা ধরতে পারেন।
- প্রতিবিম্বের অলসতা প্রশমিত করুন:
নেট ফ্রেমওয়ার্কের সাম্প্রতিক সংস্করণগুলিতে, ক্রিয়েটডেলিগেট 50 ফ্যাক্টরটি দ্বারা মেথডইনফো ডাকবে:
// 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
কল প্রায় 50x তুলনায় দ্রুততর হবে MethodInfo.Invoke
ব্যবহার draw
একটি আদর্শ হিসাবে Func
যে মত:
var res = draw(methodParams);
বিভিন্ন পদ্ধতির অনুরোধে বেঞ্চমার্ক দেখতে আমার এই পোস্টটি দেখুন