SOLID PRINCIPLE #2

Open/Closed

مفتوح للتوسيع، مقفول للتعديل

Open for extension, Closed for modification.

يعني إيه؟ زي الـ USB Port كده! الـ Port نفسه ثابت (مقفول)، بس ممكن تشبك عليه أي حاجة جديدة (مفتوح) - فلاشة، ماوس، موبايل! 🔌

THE CONCEPT

الـ USB Port 🔌

🔒 الـ Port ثابت - 🟢 الأجهزة الجديدة سهلة USB PORT 🔒 Closed for modification 🖱️ Mouse ⌨️ Keyboard 📱 Phone 💾 Flash Drive New! 🟢 Open for Extension ضيف أي جهاز جديد بدون ما تغير في الـ Port! ❌ الغلط: تفتح الـ Port وتعدل فيه عشان كل جهاز جديد! if (device == "mouse") ... else if (device == "keyboard") ... 🤮

🔒 Closed for Modification

الكود اللي شغال متغيروش! لما تيجي تضيف feature جديدة، مش هتفتح الكود القديم وتعدل فيه. ده بيحميك من إنك تبوظ حاجة كانت شغالة.

🟢 Open for Extension

عايز تضيف حاجة جديدة؟ اعمل Class جديد! زي ما بتشبك فلاشة جديدة على الـ USB - مش بتفتح اللابتوب وتغير في الـ Port.

السر: استخدم Interfaces أو Abstract Classes عشان الكود يبقى مرن! 🎯

THE CODE

شوف الفرق 💻

❌ if/else Hell

كل payment جديد = تعديل الكود!

كل ما تيجي تضيف طريقة دفع جديدة، لازم تفتح الـ function وتضيف else if تاني! ده خطر لأنك ممكن تبوظ الكود القديم.

BadPayment.js
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') ...
}
GoodPayment.js
// ✅ 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);
}

✅ Plugin System

ضيف Classes جديدة بدون تعديل!

📋 PaymentMethod: ده "العقد" - كل طريقة دفع لازم يكون عندها pay()

🔌 Easy Extension: عايز ApplePay؟ اعمل Class جديد - الكود القديم ثابت!

🔒 Safe: الـ process() مش محتاج يعرف أنواع الـ Payments

TRY IT

جرب نظام الدفع! 💰

شوف إزاي نضيف طريقة دفع جديدة بدون ما نغير في الكود القديم

// اختار طريقة الدفع واضغط Process // 🔌 شوف OCP في العمل!

📝 الخلاصة

🔒

Closed

الكود القديم متغيروش

🟢

Open

ضيف Classes جديدة براحتك

🔌

التشبيه

USB Port - ثابت بس مرن