ما هي أنماط التصميم؟
أنماط التصميم (Design Patterns) هي حلول مجربة لمشاكل متكررة في البرمجة كائنية التوجه. ليست مكتبة ولا كود جاهز—بل هي هيكل عام يمكنك تطبيقه على مشكلتك.
لماذا نستخدم أنماط التصميم؟
- إعادة استخدام الحلول — لا تخترع العجلة
- لغة مشتركة بين المطورين — تقول "Strategy" فيفهم الجميع
- مرونة وصيانة أفضل للكود
مبادئ SOLID
| المبدأ | المعنى |
|---|---|
| Single Responsibility | كل كائن مسؤول عن شيء واحد |
| Open/Closed | مفتوح للتمديد، مغلق للتعديل |
| Liskov Substitution | الكائنات الفرعية قابلة للاستبدال |
| Interface Segregation | واجهات صغيرة ومتخصصة |
| Dependency Inversion | اعتمد على التجريد، ليس على التنفيذ |
S — مبدأ المسؤولية الواحدة
// ❌ سيئ: الكلاس يعمل كل شيء
class Report {
generate() {}
saveToFile() {}
sendEmail() {}
}
// ✅ جيد: كل كلاس مسؤولية واحدة
class ReportGenerator { generate() {} }
class ReportSaver { saveToFile() {} }
class EmailService { sendEmail() {} }
O — مبدأ Open/Closed
// ❌ سيئ: تعديل الكود كل مرة نضيف شكل
class ShapeDrawer {
draw(shape) {
if (shape.type === 'circle') { /* ... */ }
if (shape.type === 'square') { /* ... */ }
}
}
// ✅ جيد: نمدد ولا نعدل
class Shape { draw() {} }
class Circle extends Shape { draw() { /* ... */ } }
class Square extends Shape { draw() { /* ... */ } }
L — مبدأ Liskov Substitution
// ❌ انتهاك: الكائن الفرعي يغير سلوك الأب
class Bird { fly() {} }
class Penguin extends Bird { fly() { throw new Error('لا يطير'); } }
// ✅ الوراثة الصحيحة
class Bird {}
class FlyingBird extends Bird { fly() {} }
class Penguin extends Bird {}
I — مبدأ Interface Segregation
// ❌ واجهة ثقيلة
class Worker {
work() {}
eat() {}
sleep() {}
}
// ✅ واجهات صغيرة
class Workable { work() {} }
class Eatable { eat() {} }
class Sleepable { sleep() {} }
D — مبدأ Dependency Inversion
// ❌ اعتماد على التنفيذ المباشر
class Store {
constructor() { this.db = new MySQLDatabase(); }
}
// ✅ اعتماد على التجريد
class Store {
constructor(db) { this.db = db; }
}
🎯 التالي: نمط Strategy