SOLID PRINCIPLE #3

Liskov Substitution

مبدأ الاستبدال

يعني إيه؟ لو عندك موظف وجيت تجيب بديله، لازم البديل يقدر يعمل نفس الشغل!
مينفعش البديل يقول "أنا مش بعرف أعمل ده!" 🔄

THE CONCEPT

مثال الطيور 🐦

الطائر الابن لازم يعمل زي الأب 🐦 Bird fly(), eat() 🦅 Eagle fly() ✓ 🕊️ Sparrow fly() ✓ 🐧 Penguin fly() ❌ ✅ النسر والعصفور OK ❌ البطريق مش بيطير!

🔄 مبدأ الاستبدال

لو عندك function بتستقبل Bird، لازم تشتغل صح مع أي نوع من الطيور.

🐧 المشكلة

البطريق "طائر" بيولوجياً، بس مش بيطير! الكود هيـ crash لما يستدعي fly() 💥

💡 الحل

نفصل FlyingBird عن NonFlyingBird!

الكود 💻

❌ Bad Design
class Bird {
  fly() { return "Flying!"; }
}

class Penguin extends Bird {
  fly() { 
    // ❌ البطريق مش بيطير!
    throw new Error("I can't fly!"); 
  }
}

// 💥 هيـ crash!
function makeBirdFly(bird) {
  return bird.fly();
}
makeBirdFly(new Penguin());
✅ Good Design
class Bird {
  eat() { return "Eating..."; }
}

class FlyingBird extends Bird {
  fly() { return "Flying!"; }
}

class NonFlyingBird extends Bird {
  walk() { return "Walking..."; }
}

class Eagle extends FlyingBird {}
class Penguin extends NonFlyingBird {
  swim() { return "Swimming!"; }
}

جرب! 🎮

// اختار طائر وشوف الفرق!
OCP ISP