SOLID PRINCIPLE #1

Single Responsibility

مبدأ المسؤولية الواحدة

A class should have only one reason to change.

يعني إيه؟ كل Class ليه شغلانة واحدة بس! زي المطعم كده... الشيف بيطبخ، الجرسون بيقدم، والكاشير بيحاسب.
مينفعش الشيف يطبخ ويقدم ويحاسب! 🍳

THE CONCEPT

المطعم المحترم 🍽️

✅ المطعم المنظم - كل واحد ليه شغلته 👨‍🍳 الشيف cook() بيطبخ بس ✓ 🧑‍🍳 الجرسون serve() بيقدم بس ✓ 💰 الكاشير checkout() بيحاسب بس ✓ ❌ الشيف اللي بيعمل كل حاجة cook() + serve() + checkout() + clean() ⚠️ لو غيرت طريقة الحساب ← ممكن تبوظ الطبخ!

👨‍🍳 الشيف

شغلته الوحيدة إنه يطبخ. مش بيقدم الأكل للزبون، ومش بيحاسب. لو فيه مشكلة في الطبخ، تروح للشيف بس.

🧑‍🍳 الجرسون

شغلته إنه ياخد الطلب ويقدم الأكل. مش بيطبخ ومش بيحاسب. لو الزبون اشتكى من الخدمة، تروح للجرسون.

💰 الكاشير

شغلته إنه يحسب الفاتورة وياخد الفلوس. بس كده! لو فيه مشكلة في الحساب، تروح للكاشير.

الخلاصة: لما كل واحد يركز في شغلانته، المطعم يشتغل زي الفل! 🎯

THE CODE

شوف الفرق في الكود 💻

❌ الكود الغلط

Class بيعمل كل حاجة!

ده زي الشيف اللي بيطبخ ويقدم ويحاسب ويمسح الأرض! لو عايز تغير طريقة الإيميل، ممكن تبوظ كل حاجة تانية.

BadEmployee.js
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...`);
  }
}
GoodDesign.js
// ✅ كل 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، التقرير مش هيتأثر.

TRY IT

جرب بنفسك! 🎮

شوف كل Class بيعمل شغلته لوحده

// كل step بتوضح مين المسؤول // جرب تضيف task وشوف!

📝 الخلاصة

🎯

القاعدة

كل Class ليه سبب واحد للتغيير

الفايدة

كود سهل الصيانة والاختبار

🍽️

التشبيه

الشيف بيطبخ، الجرسون بيقدم