الفصل 35: هندسة البرمجيات
مقدمة
هندسة البرمجيات تهتم بتصميم البنية العامة للبرنامج بحيث يكون سهل الصيانة والتوسع.
مبادئ التصميم SOLID
مبدأ المسؤولية الواحدة
كل صنف يجب أن يكون له سبب واحد للتغيير:
sad
# ✗ سيئ: صنف يفعل كل شيء
صنف مستخدم_سيئ
دالة حفظ(بيانات)
# حفظ في قاعدة البيانات
نهاية
دالة إرسال_بريد(رسالة)
# إرسال بريد
نهاية
دالة طباعة_تقرير()
# طباعة
نهاية
نهاية
# ✓ أفضل: فصل المسؤوليات
صنف مستودع_مستخدمين
دالة حفظ(مستخدم)
# حفظ في قاعدة البيانات
نهاية
دالة جلب(معرف)
# جلب من قاعدة البيانات
نهاية
نهاية
صنف خدمة_بريد
دالة إرسال(إلى، رسالة)
# إرسال بريد
نهاية
نهايةمبدأ الانفتاح/الإغلاق
مفتوح للتوسع، مغلق للتعديل:
sad
سمة شكل
دالة مساحة()
دالة محيط()
نهاية
صنف مربع نفّذ شكل
متغير ضلع
باني(ضلع)
هذا.ضلع = ضلع
نهاية
دالة مساحة()
ارجع هذا.ضلع ** 2
نهاية
دالة محيط()
ارجع هذا.ضلع * 4
نهاية
نهاية
# إضافة شكل جديد بدون تعديل الكود الموجود
صنف دائرة نفّذ شكل
متغير نصف_قطر
باني(نصف_قطر)
هذا.نصف_قطر = نصف_قطر
نهاية
دالة مساحة()
ارجع 3.14159 * هذا.نصف_قطر ** 2
نهاية
دالة محيط()
ارجع 2 * 3.14159 * هذا.نصف_قطر
نهاية
نهاية
# دالة تعمل مع أي شكل
دالة اطبع_معلومات(ش)
اطبع_سطر("المساحة: " + ش.مساحة())
اطبع_سطر("المحيط: " + ش.محيط())
نهايةالطبقات (Layered Architecture)
╔══════════════════╗
║ طبقة العرض ║ → واجهة المستخدم
╠══════════════════╣
║ طبقة المنطق ║ → قواعد العمل
╠══════════════════╣
║ طبقة البيانات ║ → قاعدة البيانات
╚══════════════════╝sad
# طبقة البيانات
صنف مستودع_منتجات
خاص متغير _منتجات = []
دالة أضف(منتج)
هذا._منتجات = هذا._منتجات + [منتج]
نهاية
دالة ابحث(معرف)
لكل م في هذا._منتجات
إذا (م["معرف"] == معرف)
ارجع م
نهاية
نهاية
ارجع لاشيء
نهاية
نهاية
# طبقة المنطق
صنف خدمة_منتجات
خاص متغير _مستودع
باني(مستودع)
هذا._مستودع = مستودع
نهاية
دالة أضف_منتج(اسم، سعر)
إذا (سعر <= 0)
ارمي "السعر يجب أن يكون موجباً"
نهاية
هذا._مستودع.أضف({"اسم": اسم، "سعر": سعر})
نهاية
نهايةتمرين
صمم نظام مكتبة باستخدام مبدأ الطبقات مع:
- طبقة بيانات للكتب والأعضاء
- طبقة منطق للإعارة والإرجاع
- طبقة عرض للقوائم والتقارير