تكرار السؤال: …
الإجابة المختصرة
يحدث الإفراط عندما تُبنى طبقات تجريد وواجهات وسيطة لميزات غير مطلوبة بدعوى الاستعداد للمستقبل، مما يضاعف تكلفة قراءة الشفرة وصيانتها دون أي عائد حقيقي.
الشرح
تظهر رائحة 'التعميم التخميني' عندما تجد واجهات برمجية لا تملك سوى تنفيذ واحد فقط، وفئات محولة (Adapters) لوظائف لن تتغير قط، ومرور المعاملات عبر خمس طبقات وسيطة لا تفعل شيئاً سوى إعادة التمرير. يجب تطبيق SOLID كعلاج لضغط التغيير الواقعي والتعقيد المتزايد، وليس كقالب إلزامي على كل سطر في تطبيق بسيط.
مثال بالكود
// Over-engineered: four abstractions just to add two numbers
interface IOperation { execute(a: number, b: number): number }
class AddOperation implements IOperation { execute(a: number, b: number) { return a + b } }
class OperationFactory { create(): IOperation { return new AddOperation() } }
const result = new OperationFactory().create().execute(1, 2)
// Start with the simplest thing that works; add abstraction when a second real requirement appears
const add = (a: number, b: number) => a + bأخطاء شائعة
- إنشاء واجهة Interface لكل فئة حتى لو كانت الفئة داخلية وغير مرشحة للاستبدال، فقط لإرضاء فكرة 'البرمجة ضد الواجهات'.