কেউ কেউ পরামর্শ দিয়েছিলেন যে বন্ধুকে ব্যবহার করে জিনিসগুলি নিয়ন্ত্রণের বাইরে চলে যেতে পারে। আমি সম্মত হব, তবে এটি এর উপযোগিতা কমায় না। আমি নিশ্চিত নই যে বন্ধুটি আপনার সমস্ত শ্রেণীর সদস্যদের পাবলিক করার চেয়ে অগত্যা ও-র দৃষ্টিতে আঘাত দেয়। অবশ্যই ভাষা আপনাকে আপনার সমস্ত সদস্যকে সর্বজনীন করার অনুমতি দেবে, তবে এটি একটি শৃঙ্খলাবদ্ধ প্রোগ্রামার যা এই ধরণের ডিজাইনের ধরণটিকে এড়িয়ে চলে। তেমনি কোনও শৃঙ্খলাবদ্ধ প্রোগ্রামার নির্দিষ্ট ক্ষেত্রে ক্ষেত্রে বন্ধুর ব্যবহার সংরক্ষণ করে যেখানে এটি অর্থবোধ করে। আমি মনে করি অভ্যন্তরীণ কিছু ক্ষেত্রে খুব বেশি প্রকাশিত হয়। সমাবেশের প্রতিটি কিছুর জন্য একটি শ্রেণি বা পদ্ধতি প্রকাশ করবেন কেন?
আমার একটি এএসপি.এনইটি পৃষ্ঠা রয়েছে যা আমার নিজস্ব পৃষ্ঠাটি উত্তরাধিকার সূত্রে উত্তম হয়, যা পরবর্তীতে System.Web.UI.Page উত্তরাধিকার সূত্রে প্রাপ্ত হয়। এই পৃষ্ঠায়, আমার কিছু কোড রয়েছে যা একটি সুরক্ষিত পদ্ধতিতে অ্যাপ্লিকেশনটির জন্য শেষ-ব্যবহারকারীর ত্রুটি প্রতিবেদন পরিচালনা করে
ReportError("Uh Oh!");
এখন, আমার পৃষ্ঠায় থাকা একটি ব্যবহারকারীর নিয়ন্ত্রণ রয়েছে। আমি চাই ব্যবহারকারী ব্যবহারকারী পৃষ্ঠায় ত্রুটি প্রতিবেদন করার পদ্ধতিগুলিতে কল করতে সক্ষম হন।
MyBasePage bp = Page as MyBasePage;
bp.ReportError("Uh Oh");
এটি রিপোর্টেরার পদ্ধতিটি সুরক্ষিত থাকলে তা করতে পারে না। আমি এটি অভ্যন্তরীণ করতে পারি, তবে এটি সমাবেশের যে কোনও কোডের সংস্পর্শে আসে। আমি কেবল এটি ইউআই উপাদানগুলিতে উন্মুক্ত করতে চাই যা বর্তমান পৃষ্ঠার অংশ (শিশু নিয়ন্ত্রণ সহ)। আরও সুনির্দিষ্টভাবে, আমি চাই আমার বেস কন্ট্রোল ক্লাসটি ঠিক একই ত্রুটি প্রতিবেদন করার পদ্ধতিগুলি সংজ্ঞায়িত করে এবং বেস পৃষ্ঠায় কেবল পদ্ধতিগুলি কল করে।
protected void ReportError(string str) {
MyBasePage bp = Page as MyBasePage;
bp.ReportError(str);
}
আমি বিশ্বাস করি যে ভাষার মতো বন্ধুর মতো ভাষা ভাষাতে কম "OO" তৈরি না করেই ব্যবহারযোগ্য এবং প্রয়োগ করা যেতে পারে, সম্ভবত বৈশিষ্ট্য হিসাবে, যাতে আপনার ক্লাস বা পদ্ধতিগুলি নির্দিষ্ট শ্রেণি বা পদ্ধতির বন্ধু হতে পারে, বিকাশকারীকে খুব সরবরাহ করতে দেয় নির্দিষ্ট অ্যাক্সেস। সম্ভবত এর মতো কিছু ... (সিউডো কোড)
[Friend(B)]
class A {
AMethod() { }
[Friend(C)]
ACMethod() { }
}
class B {
BMethod() { A.AMethod() }
}
class C {
CMethod() { A.ACMethod() }
}
আমার আগের উদাহরণের ক্ষেত্রে সম্ভবত নিম্নলিখিতগুলির মতো কিছু থাকতে পারে (একজন শব্দার্থবিজ্ঞানের পক্ষে তর্ক করতে পারে, তবে আমি কেবল ধারণাটি পাওয়ার চেষ্টা করছি):
class BasePage {
[Friend(BaseControl.ReportError(string)]
protected void ReportError(string str) { }
}
class BaseControl {
protected void ReportError(string str) {
MyBasePage bp = Page as MyBasePage;
bp.ReportError(str);
}
}
আমি এটি দেখতে পাচ্ছি, বন্ধু ধারণাটি জনসাধারণকে প্রকাশ করা, বা সদস্যদের অ্যাক্সেসের জন্য পাবলিক পদ্ধতি বা বৈশিষ্ট্য তৈরি করা ছাড়া এর ঝুঁকি নেই। যদি কোনও বন্ধু ডেটা অ্যাক্সেসযোগ্যতায় অন্য স্তরের গ্রানুলারিটির অনুমতি দেয় এবং আপনাকে সেই অ্যাক্সেসযোগ্যতাটিকে অভ্যন্তরীণ বা জনসাধারণের সাথে প্রসারিত করার পরিবর্তে সংকীর্ণ করতে দেয়।