L — استبدال ليسكوف (LSP)
يجب أن يحلّ الابن محلّ الأب دون كسر السلوك المتوقّع.
# انتهاك: Penguin يرث Bird لكنه لا يطير
class Bird:
def fly(self): ...
class Penguin(Bird):
def fly(self): raise Exception("لا أطير!") # يكسر التوقّع
# الحلّ: صمّم التسلسل بحيث لا يَعِد الأب بما لا يحقّقه الابن
I — فصل الواجهات (ISP)
لا تجبر الصنف على تنفيذ طرق لا يحتاجها — قسّم الواجهات الكبيرة لصغيرة.
# سيّئ: واجهة ضخمة
class Machine(ABC):
def print(self): ...
def scan(self): ...
def fax(self): ... # الطابعة البسيطة لا تحتاجه
# أفضل: واجهات صغيرة مركّزة
class Printer(ABC):
def print(self): ...
class Scanner(ABC):
def scan(self): ...
D — عكس الاعتمادية (DIP)
اعتمد على التجريد لا على التنفيذ الملموس.
# سيّئ: مرتبط بتنفيذ محدّد
class Service:
def __init__(self):
self.db = MySQLDatabase() # اقتران قويّ
# أفضل: احقن التجريد (مرن وقابل للاختبار)
class Service:
def __init__(self, db: Database): # أي قاعدة تحقّق الواجهة
self.db = db
💡 DIP أساس حقن الاعتماديات (Dependency Injection) والاختبار بالـ mocks.
🎯 التالي: أنماط التصميم.