Open for extension, Closed for modification.
يعني إيه؟ زي الـ USB Port كده! الـ Port نفسه ثابت (مقفول)، بس ممكن تشبك عليه أي حاجة جديدة (مفتوح) - فلاشة، ماوس، موبايل! 🔌
الكود اللي شغال متغيروش! لما تيجي تضيف feature جديدة، مش هتفتح الكود القديم وتعدل فيه. ده بيحميك من إنك تبوظ حاجة كانت شغالة.
عايز تضيف حاجة جديدة؟ اعمل Class جديد! زي ما بتشبك فلاشة جديدة على الـ USB - مش بتفتح اللابتوب وتغير في الـ Port.
السر: استخدم Interfaces أو Abstract Classes عشان الكود يبقى مرن! 🎯
كل payment جديد = تعديل الكود!
كل ما تيجي تضيف طريقة دفع جديدة، لازم تفتح الـ function وتضيف else if تاني! ده خطر لأنك ممكن تبوظ الكود القديم.
function processPayment(type, amount) {
if (type === 'credit') {
console.log(`💳 Credit: $${amount}`);
}
else if (type === 'paypal') {
console.log(`📱 PayPal: $${amount}`);
}
else if (type === 'bitcoin') {
console.log(`₿ Bitcoin: $${amount}`);
}
// ❌ كل payment جديد = else if جديد!
// else if (type === 'applePay') ...
// else if (type === 'googlePay') ...
}
// ✅ Interface (العقد)
class PaymentMethod {
pay(amount) { throw "Must implement"; }
}
// ✅ كل طريقة دفع = Class منفصل
class CreditCard extends PaymentMethod {
pay(amount) { return `💳 Credit: $${amount}`; }
}
class PayPal extends PaymentMethod {
pay(amount) { return `📱 PayPal: $${amount}`; }
}
// ✅ ضيف حاجة جديدة بدون تعديل!
class ApplePay extends PaymentMethod {
pay(amount) { return `🍎 Apple: $${amount}`; }
}
// Processor - مش محتاج تعديل أبداً!
function process(method, amount) {
return method.pay(amount);
}
ضيف Classes جديدة بدون تعديل!
📋 PaymentMethod: ده "العقد" - كل طريقة دفع لازم يكون عندها pay()
🔌 Easy Extension: عايز ApplePay؟ اعمل Class جديد - الكود القديم ثابت!
🔒 Safe: الـ process() مش محتاج يعرف أنواع الـ Payments
شوف إزاي نضيف طريقة دفع جديدة بدون ما نغير في الكود القديم
الكود القديم متغيروش
ضيف Classes جديدة براحتك
USB Port - ثابت بس مرن