يا صاحبي، تخيلت أن السوفت وير ده مترابط زي الكفتة والبطاطس؟ 🤔
يا سيدي، في يوم من الأيام كنت جاي في انترفيو شركتي الحالية، وفجأة سألوني سؤال خلاني أقف لحظة وأفكر. يعني، كنا بنقول إن OOP وSOLID دي مبادئ مهمة جداً، بس هل فعلاً إحنا عارفين إزاي كل واحد منهم بيتماشى مع التاني؟
كلنا كـ Developers عارفين الأشياء دي:
- مبادئ الـ OOP الأربعة: Encapsulation, Inheritance, Polymorphism, Abstraction
- ومبادئ SOLID اللي بنحاول نطبقها دائماً
بس السؤال اللي عمل Reset في دماغي كان: كل مبدأ من مبادئ SOLID بيعتمد أو بيتحقق بإيه من مبادئ الـ OOP؟
ساعتها أدركت إننا ساعات بنتعامل مع OOP و SOLID كأنهم قائمة للحفظ أو Checkboxes في Code Review. مع إنه الحقيقة إنهم مكمّلين بعض، ومش ممكن تفهم واحد صح من غير التاني.
1️⃣ Single Responsibility Principle (SRP) ⬅️ Encapsulation
الفكرة هنا، يا صاحبي، إن الكلاس يكون ليه سبب واحد للتغيير. عشان كده لازم تعمل Encapsulation صح. يعني، تجمع الداتا والـ Methods اللي ليهم علاقة واحدة في مكان واحد، وتخفي أي تفاصيل ملهاش علاقة بالمسؤولية الأساسية.
لو لقيت كلاس بيعمل Validation وPersistence وLogging وBusiness Logic، يعني ده كاسر SRP وكاسر Encapsulation في نفس الوقت. Encapsulation مش بس private variables، دي فصل مسؤوليات قبل أي حاجة.
2️⃣ Open/Closed Principle (OCP) ⬅️ Inheritance + Polymorphism
المبدأ ده محتاج ترسين شغالين مع بعض. Inheritance علشان تزود Behavior جديد من غير ما تعدّل في الكود القديم. Polymorphism علشان السيستم يتعامل مع الـ Child كأنه Parent من غير if/else ومن غير ما "يضرب".
يعني، الكود القديم يفضل ثابت، والجديد يدخل من غير ما حد يحس. لو بتكسر OCP، غالباً هتلاقي if/else على نوع الكلاس أو switch على enum، وده معناه إنك مش مستغل Polymorphism صح.
3️⃣ Liskov Substitution Principle (LSP) ⬅️ Inheritance (بس الصح)
LSP بيقولك: أي Child Class لازم يقدر يحل محل الـ Parent من غير ما يبوّظ سلوك السيستم. لو ورثت كلاس وبقيت تعمل Override وتكسر الـ Contract أو تغيّر السلوك المتوقع، يعني ده Inheritance شكلي وCopy-paste مقنّع. LSP هو اللي بيفرق بين وراثة منطقية ووراثة شكلها حلو بس خطرها كبير. Inheritance من غير LSP = قنبلة موقوتة 💣
4️⃣ Interface Segregation Principle (ISP) 5️⃣ Dependency Inversion Principle (DIP) ⬅️ Abstraction
الاتنين دول قايمين بالكامل على Abstraction. ISP بيقولك ما تعملش Interface تخينة وما تجبرش Class ينفّذ Methods مش محتاجها. كل Interface صغير واضح ليه هدف واحد. DIP بيقولك High-level modules ما تعتمدش على Low-level modules، الاتنين يعتمدوا على Abstraction. يعني، اعتمد على Interface مش Implementation. وده اللي بيفتح الباب لـ Dependency Injection, Mocking, Unit Testing حقيقي.
💡 الخلاصة
OOP هي أدوات في إيدك، وSOLID هو دليل استخدام الأدوات دي. OOP من غير SOLID كود Object-Oriented شكلي بس هش وسهل يكبر غلط. SOLID من غير فهم OOP مبادئ محفوظة بتتطبق غلط. لكن لما الاتنين يشتغلوا مع بعض، تبني Software يعيش سنين، مش كود شغال النهاردة ويصبح Legacy بكرة 🧱
إذا كنت عايز بعد كده أمثلة كود أو مقارنة غلط/صح أو أسئلة انترفيو شبه دي، فالباقي عليك تقول لي. والله العظيم، أنا استمتعت أوي أشاركك هذه المعلومة!