تكرار السؤال: …
الإجابة المختصرة
يكون الكود مفتوحاً للتوسيع (إضافة ميزات جديدة) ومغلقاً للتعديل (دون الحاجة لتغيير الكود المجرب مسبقاً) عبر الاعتماد على الواجهات والاستراتيجيات المجردة.
الشرح
الهدف هو إضافة ميزة جديدة بمجرد كتابة فئة جديدة تنفذ واجهة محددة دون فتح وتعديل ملفات الكود الحالية بسلاسل switch-case طويلة. ولكن يجب تطبيقه بحذر فقط عند محاور التغيير المؤكدة (Axes of Change)، وليس على كل سطر تحسباً لمستقبل وهمي (YAGNI).
مثال بالكود
interface PaymentGateway {
process(amount: number): Promise<void>;
}
class StripeGateway implements PaymentGateway { /*...*/ }
class PayPalGateway implements PaymentGateway { /*...*/ }
class PaymentProcessor {
constructor(private gateway: PaymentGateway) {}
execute(amount: number) { return this.gateway.process(amount); }
}أخطاء شائعة
- تعديل كود مجرب ويعمل في الإنتاج بإضافة شروط if/else جديدة لكل عميل جديد، بدلاً من استخدام نمط الاستراتيجية (Strategy).