مبادئ SOLID هي مجموعة من القواعد التي تساعد المطورين على كتابة كود منظم وقابل للصيانة بسهولة. هذه المبادئ تجعل البرمجيات أكثر استقرارًا وسهولة في التعديل والتطوير مع مرور الوقت. هل تريد كتابة كود أنظف وأسهل للصيانة؟ 🚀 فهم مبادئ SOLID هو المفتاح! إليك دليل بسيط ومباشر لفهم هذه المبادئ الأساسية في التصميم: ✨
1. مبدأ المسؤولية الفردية𝐒𝐢𝐧𝐠𝐥𝐞 𝐑𝐞𝐬𝐩𝐨𝐧𝐬𝐢𝐛𝐢𝐥𝐢𝐭𝐲 𝐏𝐫𝐢𝐧𝐜𝐢𝐩𝐥𝐞 (SRP) 🛠️
كل class يجب أن تكون مسؤولة عن وظيفة واحدة محددة فقط لضمان سهولة الصيانة والتطوير.
مثال: class التي تتعامل مع بيانات العملاء لا يجب أن تكون مسؤولة أيضًا عن عرض هذه البيانات في واجهة المستخدم.
2. مبدأ الفتح/الإغلاق 𝐎𝐩𝐞𝐧/𝐂𝐥𝐨𝐬𝐞𝐝 𝐏𝐫𝐢𝐧𝐜𝐢𝐩𝐥𝐞 (OCP) 🔓
يجب أن تكون الكائنات البرمجية قابلة للتوسيع ولكن غير قابلة للتعديل. يمكنك إضافة وظائف جديدة دون تغيير الكود الأصلي، مما يساعد في تقليل خطر إدخال أخطاء جديدة في النظام.
مثال: عند إضافة طريقة دفع جديدة، يمكنك إنشاء class جديد ترث من class الدفع الأساسية بدلاً من تعديل الكود القديم.
3. مبدأ استبدال ليسكوف 𝐋𝐢𝐬𝐤𝐨𝐯 𝐒𝐮𝐛𝐬𝐭𝐢𝐭𝐮𝐭𝐢𝐨𝐧 𝐏𝐫𝐢𝐧𝐜𝐢𝐩𝐥𝐞 (LSP) 🔄
يجب أن يكون بإمكانك استبدال كائنات Parent Class بكائنات من Child Class دون أن يتأثر البرنامج.
مثال: إذا كان لديك فئة Bird
وفئة فرعية Penguin
، يجب أن تستطيع استبدال Bird
بـ Penguin
دون أن يؤثر ذلك على عمل البرنامج.
4. مبدأ الفصل بين الواجهات (ISP) 𝐈𝐧𝐭𝐞𝐫𝐟𝐚𝐜𝐞 𝐒𝐞𝐠𝐫𝐞𝐠𝐚𝐭𝐢𝐨𝐧 𝐏𝐫𝐢𝐧𝐜𝐢𝐩𝐥𝐞🔌
لا ينبغي أن يُجبر العملاء على استخدام methods لا يحتاجونها. يجب تقسيم interfaces الكبيرة إلى interfaces أصغر وأكثر تحديدًا، مثل تقسيم قائمة طعام كبيرة إلى قوائم أصغر وأكثر تخصصًا لسهولة الاستخدام.
مثال: بدلاً من أن تكون هناك واجهة Monster
تحتوي على methods مثل fly()
و swim()
، يجب إنشاء interfaces منفصلة مثل FlyingMonster
و SwimmingMonster
.
5. مبدأ عكس الاعتماديات 𝐃𝐞𝐩𝐞𝐧𝐝𝐞𝐧𝐜𝐲 𝐈𝐧𝐯𝐞𝐫𝐬𝐢𝐨𝐧 𝐏𝐫𝐢𝐧𝐜𝐢𝐩𝐥𝐞 (DIP) ⚡
يجب أن تعتمد الوحدات البرمجية على واجهات تجريدية وليس على تفاصيل محددة، لتسهيل تغيير التفاصيل لاحقًا دون التأثير على النظام.
مثال: لا يجب أن تعتمد classCar
بشكل مباشر على classGasEngine
. بدلاً من ذلك، يجب أن تعتمد على واجهة Engine
التي ينفذها GasEngine
. بهذه الطريقة، يمكنك بسهولة استبدال GasEngine
بـ ElectricEngine
.
مبادئ SOLID تساعد المطورين على كتابة أنظمة برمجية قوية وسهلة الصيانة والتوسيع. أي من هذه المبادئ تستخدمه أكثر في برمجتك اليومية؟ أو أي منها تجده صعبًا في التطبيق؟ 💬
لنتحدث في التعليقات! 💡