كلما كانت اجزاء البرنامج منفصلة عن بعضها كلما عاش معنا اكثر حيث تسهل صيانته و تطويره و اختباره . ذكرت في سلاسل سابقة اهمية مباديء SOLID في برمجة الـOOP. و سأركز هنا على اخر مبدأين الـI و D. و قليل عن الIoC و الـDI.
لكن هناك مقدمات مهمة لفهم الصورة كاملة. ( سلسلة )
لكن هناك مقدمات مهمة لفهم الصورة كاملة. ( سلسلة )
1.عندما نقول عن SOLID أنها مباديء Principles. فهذا يعني انها شيء يشبه الأخلاق التي علينا ان نتبناها عند تصميم الClasses. فليس بالضرورة أن تأتي بتفاصيل او ارشادات عن كيفية تمثيلها , الكيفية تأتي بها الDesign Patterns.
2.لاحظ أن اول مبدأ في SOLID هو الSingle Responsibility أي ان الكلاس عليه أن يكون مسؤولاً عن شيء واحدة فقط و قد يكون لهذه المسؤولية عدة مهام , فكثرة الmethods ليس بالضرورة تعني كثرة الResponsibility بل ما الذي يقوم به الميثود.
3.مثلاً قد يكون لدينا ميثود Save في كلاس Student لحفظ بيانات الObject و نحتاج إلى حفظها في قاعدة بيانات و تسجيل Log بالحدث. التعامل مع قاعدة البيانات و الLog هذه مسؤولية Class اخر, نحن هنا علينا أن نحفظ الstate فقط في الذاكرة.
4.لو قلنا مثلاً سننشيء كلاس خاص بحفظ في قاعدة البيانات و نناديه من كلاسنا الحالي فنحن هنا ايضاً كسرنا مبدأ SRP لاننا جعلنا كلاسنا متحكم في سير البرنامج من كلاس إلى اخر و هذه مسؤولية Responsibility أخرى!. هذا بالإضافة انه كسر كامل لمبدأ الDIP
5.مبدأ الDIP او Dependency Inversion Principle يقول لنا انه لايجب ان يعتمد كلاس عالي مهم على كلاس اخر ادنى منه. بمعنى انه لوكان الكلاس العالي هو Student مثلاً فلا يجب ان يعتمد على كلاس الDatabaseOperation مثلاً, لأن اي تغيير في الثاني قد يسبب مشكلة في الاول.
6. مبدأ ال Dependency Inversion يقع ضمن مباديء و انماط تصميم اخرى و احيانا اطر عمل frameworks لها نفس الأسماء قد تسبب بنوع من التشويش مثل Inversion of Control - IoC و Dependency Injection و ايضاً IoC Container.
7. اغلب من قرأ عن الOOP لابد و أن صادفته تلك المصطلحات و التي بعضها له كتب خاصة تتحدث فقط عنه. الفكرة هنا فقط ازالة اللبس , لذا مبدئياً نقول ان IoC و DIP هي مباديء , يمكن تطبيقها عن طريق Design Pattern مثل DI و نسهل او ندير العملية من خلال إطار IoC Container.
8. اعيد اذكر ان الفكرة الأساسية هي الوصول إلى حالة الLoosely Coupled Classes , كلاسات منفصلة لا ترتبط مع بعضها ارتباط وثيق بحيث اننا نستطيع ان نغير اي كلاس بدون أن نؤثر على الآخر. و نكتفي بالتواصل او التعامل بينهم كـTeam و ليس Master - Slave.
9. لنصل إلى الLoosely Coupled Classes علينا اولاً استخدام الIoC ثم الDIP ثم الDI ثم نستخدم IoC Container. سأحتاج لسلاسل قادمة لشرح كل منها .
10. أخيراً ال Object Oriented Programming لم تأتي كأكسسوارات او رفاهية للبرمجة بل اتت لتحل مشكلة. إذا كانت برامجنا كلاسات تنادي ميثود مباشرة من كلاسات اخرى اعتماداً على If و Switch و غيرها فنحن هنا نقوم بProcedural Programming و ليس OOP.
جاري تحميل الاقتراحات...