A class should have only one reason to change.
يعني إيه؟
كل Class ليه شغلانة واحدة بس! زي المطعم كده... الشيف بيطبخ، الجرسون بيقدم، والكاشير بيحاسب.
مينفعش الشيف يطبخ ويقدم ويحاسب! 🍳
شغلته الوحيدة إنه يطبخ. مش بيقدم الأكل للزبون، ومش بيحاسب. لو فيه مشكلة في الطبخ، تروح للشيف بس.
شغلته إنه ياخد الطلب ويقدم الأكل. مش بيطبخ ومش بيحاسب. لو الزبون اشتكى من الخدمة، تروح للجرسون.
شغلته إنه يحسب الفاتورة وياخد الفلوس. بس كده! لو فيه مشكلة في الحساب، تروح للكاشير.
الخلاصة: لما كل واحد يركز في شغلانته، المطعم يشتغل زي الفل! 🎯
Class بيعمل كل حاجة!
ده زي الشيف اللي بيطبخ ويقدم ويحاسب ويمسح الأرض! لو عايز تغير طريقة الإيميل، ممكن تبوظ كل حاجة تانية.
class SuperEmployee {
// ❌ بيعمل report
generateReport(data) {
return `Report: ${data}`;
}
// ❌ وكمان بيحفظ files
saveToFile(content, filename) {
console.log(`Saving to ${filename}`);
}
// ❌ وكمان بيبعت email
sendEmail(content, email) {
console.log(`Sending to ${email}`);
}
// ❌ وكمان بيطبع!
printReport(content) {
console.log(`Printing...`);
}
}
// ✅ كل class ليه شغلانة واحدة
class ReportGenerator {
generate(data) {
return `Report: ${data}`;
}
}
class FileSaver {
save(content, filename) {
console.log(`💾 Saved to ${filename}`);
}
}
class EmailSender {
send(content, email) {
console.log(`📧 Sent to ${email}`);
}
}
// المنسق - بيستخدم كل الـ classes
class ReportWorkflow {
constructor() {
this.generator = new ReportGenerator();
this.saver = new FileSaver();
this.emailer = new EmailSender();
}
}
كل Class ليه مسؤولية واحدة
📄 ReportGenerator: شغلته الوحيدة يعمل التقرير. مش فاهم حاجة عن الإيميل أو الملفات.
💾 FileSaver: شغلته الوحيدة يحفظ في ملف. لو غيرت طريقة الحفظ، الباقي مش هيتأثر.
📧 EmailSender: شغلته الوحيدة يبعت إيميل. لو غيرت الـ provider، التقرير مش هيتأثر.
شوف كل Class بيعمل شغلته لوحده
كل Class ليه سبب واحد للتغيير
كود سهل الصيانة والاختبار
الشيف بيطبخ، الجرسون بيقدم