🛡️ التحكم في الوصول إلى البيانات: شرح Access Modifiers في TypeScript
في الدروس السابقة، تعلمنا كيف ننشئ الكلاسات (Classes) ونضيف إليها الخصائص والوظائف. لكن، هل سألت نفسك يوماً: "هل يجب أن تكون جميع البيانات داخل الكلاس متاحة للجميع؟" 🤔
في الواقع، في البرمجة الاحترافية، نحتاج أحياناً لإخفاء بعض البيانات لمنع التلاعب بها من خارج الكلاس. هنا يأتي دور محددات الوصول (Access Modifiers).
محددات الوصول هي كلمات دلالية نضعها قبل تعريف الخاصية (Property) أو الدالة (Method) لنحدد من يحق له رؤيتها أو استخدامها. في TypeScript، لدينا ثلاثة أنواع أساسية:
public(عام)private(خاص)protected(محمي)
1️⃣ المحدد العام: public 🌍
هذا هو النوع الافتراضي في TypeScript. إذا لم تضع أي كلمة قبل الخاصية، فإن TypeScript سيعتبرها public تلقائياً.
ماذا يعني public؟
يعني أن هذه الخاصية يمكن الوصول إليها من أي مكان: من داخل الكلاس نفسه، ومن خارج الكلاس بعد إنشاء كائن (Object) منه.
مثال توضيحي:
class User {
public username: string; // خاصية عامة
constructor(name: string) {
this.username = name;
}
public sayHello(): void { // دالة عامة
console.log("Hello " + this.username);
}
}
const myUser = new User("Ahmed");
console.log(myUser.username); // ✅ مسموح: يمكن الوصول إليها من الخارج
myUser.sayHello(); // ✅ مسموح: يمكن استدعاؤها من الخارج
2️⃣ المحدد الخاص: private 🔒
هذا المحدد هو الأقوى من حيث الحماية. عندما نجعل الخاصية private فإننا نضعها في "صندوق مغلق".
ماذا يعني private؟
يعني أن هذه الخاصية لا يمكن الوصول إليها أو تعديلها إلا من داخل الكلاس نفسه فقط. إذا حاولت الوصول إليها من خارج الكلاس، سيقوم TypeScript بإعطائك خطأ فوراً.
لماذا نستخدمه؟ لحماية البيانات الحساسة (مثل كلمة المرور) أو العمليات الداخلية التي لا تهم المستخدم النهائي.
مثال توضيحي:
class BankAccount {
public accountHolder: string; // اسم صاحب الحساب متاح للجميع
private balance: number; // الرصيد سري جداً ولا يظهر للخارج
constructor(name: string, initialBalance: number) {
this.accountHolder = name;
this.balance = initialBalance;
}
public checkBalance(): void {
// ✅ مسموح: الوصول للخاصية private من داخل الكلاس نفسه
console.log("Your balance is: " + this.balance);
}
}
const myAccount = new BankAccount("Sara", 1000);
console.log(myAccount.accountHolder); // ✅ مسموح
myAccount.checkBalance(); // ✅ مسموح (لأن الدالة العامة هي من تطلب الرصيد)
// console.log(myAccount.balance); // ❌ خطأ! لا يمكنك الوصول لخاصية private من الخارج
3️⃣ المحدد المحمي: protected 🛡️
هذا المحدد هو "الحل الوسط" بين public و private. هو يشبه private في أنه يمنع الوصول من الخارج، ولكنه يمنح ميزة إضافية.
ماذا يعني protected؟
يعني أن الخاصية لا يمكن الوصول إليها من خارج الكلاس، ولكن يمكن الوصول إليها داخل الكلاس نفسه وداخل الكلاسات التي ترث منه (Subclasses).
مثال توضيحي:
class Employee {
protected salary: number; // خاصية محمية
constructor(amount: number) {
this.salary = amount;
}
}
class Manager extends Employee {
public showSalary(): void {
// ✅ مسموح: الكلاس Manager يرث من Employee لذا يمكنه الوصول للـ protected
console.log("Manager salary is: " + this.salary);
}
}
const myManager = new Manager(5000);
myManager.showSalary(); // ✅ مسموح
// console.log(myManager.salary); // ❌ خطأ! لا يمكن الوصول للـ protected من خارج الكلاسات
📊 ملخص سريع للمقارنة
| المحدد | الوصول من داخل الكلاس | الوصول من الكلاسات الوارثة | الوصول من خارج الكلاس |
|---|---|---|---|
public |
✅ | ✅ | ✅ |
protected |
✅ | ✅ | ❌ |
private |
✅ | ❌ | ❌ |
💡 نصيحة ذهبية
دائماً اجعل خصائصك private بشكل افتراضي، واجعلها public فقط إذا كنت متأكداً أن الكود الخارجي يحتاج فعلاً للوصول إليها. هذا المبدأ يسمى في البرمجة Encapsulation (التغليف)، وهو يجعل كودك أكثر أماناً وأسهل في الصيانة.
🎓 اختبر معلوماتك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال