S — المسؤولية الواحدة (SRP)
لكل صنف سبب واحد فقط للتغيير (مسؤولية واحدة).
# سيّئ: الصنف يفعل كل شيء
class User:
def save(self): ... # قاعدة بيانات
def send_email(self): ... # بريد
def to_json(self): ... # تنسيق
# أفضل: افصل المسؤوليات
class User: ...
class UserRepository:
def save(self, user): ...
class EmailService:
def send(self, user): ...
O — الانفتاح/الانغلاق (OCP)
الكود مفتوح للتوسعة، مغلق للتعديل: أضِف سلوكًا جديدًا دون تغيير الكود القائم.
# سيّئ: تعدّل الدالة كلّما أضفت شكلًا
def area(shape):
if shape.type == "circle": ...
elif shape.type == "square": ...
# أفضل: كل شكل يعرف مساحته (توسّع بالوراثة)
class Shape(ABC):
@abstractmethod
def area(self): ...
class Circle(Shape):
def area(self): ...
class Square(Shape):
def area(self): ...
# إضافة Triangle لا تتطلّب تعديل أي كود قائم
💡 OCP يتحقّق غالبًا بالتجريد (واجهات/أصناف مجرّدة) وتعدّد الأشكال.
🎯 التالي: مبادئ L و I و D.