Skip to content

الفصل 35: هندسة البرمجيات

مقدمة

هندسة البرمجيات تهتم بتصميم البنية العامة للبرنامج بحيث يكون سهل الصيانة والتوسع.

مبادئ التصميم SOLID

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

كل صنف يجب أن يكون له سبب واحد للتغيير:

sad
# ✗ سيئ: صنف يفعل كل شيء
صنف مستخدم_سيئ
    دالة حفظ(بيانات)
        # حفظ في قاعدة البيانات
    نهاية
    دالة إرسال_بريد(رسالة)
        # إرسال بريد
    نهاية
    دالة طباعة_تقرير()
        # طباعة
    نهاية
نهاية

# ✓ أفضل: فصل المسؤوليات
صنف مستودع_مستخدمين
    دالة حفظ(مستخدم)
        # حفظ في قاعدة البيانات
    نهاية
    دالة جلب(معرف)
        # جلب من قاعدة البيانات
    نهاية
نهاية

صنف خدمة_بريد
    دالة إرسال(إلى، رسالة)
        # إرسال بريد
    نهاية
نهاية

مبدأ الانفتاح/الإغلاق

مفتوح للتوسع، مغلق للتعديل:

sad
سمة شكل
    دالة مساحة()
    دالة محيط()
نهاية

صنف مربع نفّذ شكل
    متغير ضلع
    
    باني(ضلع)
        هذا.ضلع = ضلع
    نهاية
    
    دالة مساحة()
        ارجع هذا.ضلع ** 2
    نهاية
    
    دالة محيط()
        ارجع هذا.ضلع * 4
    نهاية
نهاية

# إضافة شكل جديد بدون تعديل الكود الموجود
صنف دائرة نفّذ شكل
    متغير نصف_قطر
    
    باني(نصف_قطر)
        هذا.نصف_قطر = نصف_قطر
    نهاية
    
    دالة مساحة()
        ارجع 3.14159 * هذا.نصف_قطر ** 2
    نهاية
    
    دالة محيط()
        ارجع 2 * 3.14159 * هذا.نصف_قطر
    نهاية
نهاية

# دالة تعمل مع أي شكل
دالة اطبع_معلومات(ش)
    اطبع_سطر("المساحة: " + ش.مساحة())
    اطبع_سطر("المحيط: " + ش.محيط())
نهاية

الطبقات (Layered Architecture)

╔══════════════════╗
║   طبقة العرض     ║  → واجهة المستخدم
╠══════════════════╣
║  طبقة المنطق    ║  → قواعد العمل
╠══════════════════╣
║  طبقة البيانات  ║  → قاعدة البيانات
╚══════════════════╝
sad
# طبقة البيانات
صنف مستودع_منتجات
    خاص متغير _منتجات = []
    
    دالة أضف(منتج)
        هذا._منتجات = هذا._منتجات + [منتج]
    نهاية
    
    دالة ابحث(معرف)
        لكل م في هذا._منتجات
            إذا (م["معرف"] == معرف)
                ارجع م
            نهاية
        نهاية
        ارجع لاشيء
    نهاية
نهاية

# طبقة المنطق
صنف خدمة_منتجات
    خاص متغير _مستودع
    
    باني(مستودع)
        هذا._مستودع = مستودع
    نهاية
    
    دالة أضف_منتج(اسم، سعر)
        إذا (سعر <= 0)
            ارمي "السعر يجب أن يكون موجباً"
        نهاية
        هذا._مستودع.أضف({"اسم": اسم، "سعر": سعر})
    نهاية
نهاية

تمرين

صمم نظام مكتبة باستخدام مبدأ الطبقات مع:

  • طبقة بيانات للكتب والأعضاء
  • طبقة منطق للإعارة والإرجاع
  • طبقة عرض للقوائم والتقارير

مُرخَّص بموجب رخصة MIT