الدرس 26 من دورة Python للمبتدئين

هيكلة المشروع النهائي: رتّب برنامج المشتريات قبل النسخة الاحترافية

في الدروس السابقة بنينا أجزاء قوية: قوائم، dict، دوال، return، و try و except. الآن سنرتب المشروع في ملف واضح حتى يصبح أقرب لبرنامج حقيقي قابل للتطوير.

المستوى: مبتدئ جدًا النتيجة: ملف مشروع منظم مدة التطبيق: 35 - 40 دقيقة
طريقة CIT للتعلم الهادئ: في هذا الدرس لا تبحث عن أمر جديد فقط. ابحث عن طريقة تفكير: أين أضع كل جزء من البرنامج؟ ولماذا؟
مهم قبل البداية: سنستخدم دالة اسمها main. هذه ليست تعويذة أو أمرًا صعبًا، بل دالة نجمع داخلها خطوات تشغيل البرنامج.

ما النتيجة التي يجب أن تخرج بها؟

في نهاية الدرس سيكون ملفك مرتبًا بهذا الشكل:

TAX_RATE = 0.15

def calculate_tax(total):
    ...

def create_product(product_name, price):
    ...

def print_report(products, total):
    ...

def main():
    ...

main()

المعنى: نضع الإعدادات في الأعلى، ثم الدوال، ثم دالة التشغيل، وفي النهاية نستدعي البرنامج.

TAX_RATE إعداد ثابت لنسبة الضريبة.
functions دوال واضحة لكل مهمة.
main() نقطة تشغيل البرنامج.
خريطة درس هيكلة المشروع النهائي في Python
الفرق بين كود غير مرتب وكود منظم في Python
1

لماذا نحتاج هيكلة المشروع؟

عندما يكون البرنامج صغيرًا، قد تكتب كل شيء في مكان واحد ويعمل. لكن عندما يكبر البرنامج، يصبح التعديل صعبًا إذا لم يكن مرتبًا.

برنامج المشتريات صار يحتوي على:

إدخال منتجات
حساب ضريبة
حساب إجمالي نهائي
التعامل مع أخطاء السعر
طباعة تقرير

لذلك نحتاج ترتيبًا واضحًا حتى لا يتحول البرنامج إلى كتلة طويلة يصعب فهمها.

الفكرة ببساطة: الهيكلة لا تغيّر نتيجة البرنامج، لكنها تجعل البرنامج أوضح وأسهل في التطوير.
تحقق قبل الانتقال ✅ هل فهمت أن الهدف هنا تنظيم المشروع وليس إضافة ميزة جديدة فقط؟
2

أنشئ ملف الدرس السادس والعشرين

افتح مجلد الدورة داخل VS Code:

python_course

ثم أنشئ ملفًا جديدًا باسم:

lesson_26.py

افتح الملف داخل Editor.

توقف لحظة ✅ هل ظهر ملف lesson_26.py داخل Explorer؟ إذا نعم، انتقل للخطوة التالية.
3

افهم ترتيب الملف قبل الكتابة

سنرتب ملف lesson_26.py بهذا الشكل:

هيكلة ملف برنامج المشتريات في Python
أعلى الملف إعدادات ثابتة مثل نسبة الضريبة.
وسط الملف الدوال التي تنفذ مهام محددة.
آخر الملف تشغيل البرنامج باستدعاء main.
سؤال سريع 🧠 لماذا لا نضع main في أول الملف قبل تعريف الدوال؟ لأن main ستستخدم هذه الدوال، لذلك نعرّف الأدوات أولًا.
4

اكتب الإعدادات الثابتة

في أعلى الملف، اكتب:

TAX_RATE = 0.15

هذا المتغير يمثل نسبة الضريبة. كتبناه بحروف كبيرة لأنه قيمة ثابتة غالبًا لا تتغير أثناء تشغيل البرنامج.

لماذا هذا أفضل؟ بدل أن نكتب 0.15 داخل أكثر من مكان، نضعها في متغير واضح. إذا تغيرت النسبة لاحقًا، نعدل مكانًا واحدًا فقط.
تحقق قبل الانتقال ✅ هل فهمت لماذا وضعنا نسبة الضريبة في أعلى الملف؟
5

اكتب دوال الحساب

بعد الإعدادات، اكتب دوال الحساب:

def calculate_tax(total):
    return total * TAX_RATE

def calculate_final_total(total, tax):
    return total + tax

دالة calculate_tax تستخدم TAX_RATE من أعلى الملف، ودالة calculate_final_total تجمع المجموع مع الضريبة.

قاعدة مهمة: الدوال التي تحسب لا تطبع. هي ترجع نتيجة باستخدام return.
سؤال سريع 🧠 هل calculate_tax تطبع الضريبة؟ لا، ترجعها حتى نستخدمها لاحقًا.
6

اكتب دالة إنشاء المنتج

بدل أن نكتب dict المنتج داخل الحلقة مباشرة، سنضع إنشاء المنتج في دالة:

def create_product(product_name, price):
    product = {
        "name": product_name,
        "price": price
    }

    return product

هذه الدالة تستقبل اسم المنتج وسعره، ثم ترجع dict يمثل المنتج.

لماذا هذا مفيد؟ لأن إنشاء المنتج أصبح له مكان واضح. لاحقًا إذا أضفنا كمية أو خصم أو تصنيف، سنعدل دالة create_product بدل تعديل أماكن كثيرة.
تحقق قبل الانتقال ✅ هل فهمت أن create_product لا تضيف المنتج إلى القائمة؟ هي فقط تنشئ المنتج وترجعه.
7

اكتب دالة التقرير

الآن اكتب دالة التقرير:

def print_report(products, total, tax, final_total):
    print("----- تقرير المنتجات -----")

    for product in products:
        name = product["name"]
        price = product["price"]

        print(f"{name}: {price:.2f} ريال")

    print(f"عدد المنتجات: {len(products)}")
    print(f"الإجمالي قبل الضريبة: {total:.2f} ريال")
    print(f"الضريبة: {tax:.2f} ريال")
    print(f"الإجمالي النهائي: {final_total:.2f} ريال")

هذه الدالة مسؤولة عن العرض فقط. لا تدخل منتجات، ولا تحسب ضريبة، ولا تنشئ product.

قاعدة احترافية مبسطة: حاول أن تجعل كل دالة لها مهمة واضحة واحدة.
تحقق قبل الانتقال ✅ هل فهمت أن print_report وظيفتها طباعة التقرير فقط؟
8

افهم دالة main

دالة main ستكون مكان تشغيل البرنامج:

def main():
    هنا نكتب خطوات تشغيل البرنامج
تدفق دالة main في Python
مهم للمبتدئ: اسم main ليس إلزاميًا في هذا المستوى، لكنه اسم مشهور ومعناه واضح: المكان الرئيسي لتشغيل البرنامج.
سؤال سريع 🧠 هل main تعمل بمجرد تعريفها؟ لا. تعمل عندما نكتب main() في آخر الملف.
9

رتّب الكود النهائي على أجزاء

الجزء الأول: الإعدادات ودوال الحساب:

TAX_RATE = 0.15

def calculate_tax(total):
    return total * TAX_RATE

def calculate_final_total(total, tax):
    return total + tax

الجزء الثاني: دالة إنشاء المنتج:

def create_product(product_name, price):
    product = {
        "name": product_name,
        "price": price
    }

    return product

الجزء الثالث: دالة التقرير:

def print_report(products, total, tax, final_total):
    print("----- تقرير المنتجات -----")

    for product in products:
        name = product["name"]
        price = product["price"]

        print(f"{name}: {price:.2f} ريال")

    print(f"عدد المنتجات: {len(products)}")
    print(f"الإجمالي قبل الضريبة: {total:.2f} ريال")
    print(f"الضريبة: {tax:.2f} ريال")
    print(f"الإجمالي النهائي: {final_total:.2f} ريال")

الجزء الرابع: بداية دالة main:

def main():
    products = []
    total = 0

    name_prompt = "اسم المنتج أو done: "
    price_prompt = "سعر المنتج: "

الجزء الخامس: استقبال المنتجات داخل main:

    while True:
        product_name = input(name_prompt).strip()

        if product_name.lower() == "done":
            break

        price_text = input(price_prompt).strip()

        try:
            price = float(price_text)
        except ValueError:
            print("السعر غير صحيح، اكتب رقمًا فقط")
            continue

الجزء السادس: إنشاء المنتج وإضافته داخل main:

        product = create_product(
            product_name,
            price
        )

        products.append(product)
        total = total + price

الجزء السابع: حساب النتائج وطباعة التقرير داخل main:

    tax = calculate_tax(total)
    final_total = calculate_final_total(
        total,
        tax
    )

    print_report(
        products,
        total,
        tax,
        final_total
    )

الجزء الثامن والأخير: تشغيل البرنامج:

main()
مهم جدًا: الأجزاء السابقة تُكتب في نفس ملف lesson_26.py بالترتيب. وانتبه للمسافات داخل main وداخل while وداخل try.
تحقق قبل الانتقال ✅ هل فهمت أن main تحتوي خطوات التشغيل، بينما الدوال الأخرى تساعدها في الحساب والإنشاء والطباعة؟
10

شغّل البرنامج

احفظ الملف:

Ctrl + S

ثم شغله:

python lesson_26.py

وإذا لم يعمل أمر python:

py lesson_26.py
خريطة النسخة المرتبة من برنامج المشتريات
تحقق قبل الانتقال ✅ هل اشتغل البرنامج وبدأ يطلب اسم المنتج؟
11

اختبر نفس السيناريو السابق

جرّب هذه الإدخالات:

اسم المنتج أو done: Keyboard
سعر المنتج: abc
السعر غير صحيح، اكتب رقمًا فقط

اسم المنتج أو done: Keyboard
سعر المنتج: 100

اسم المنتج أو done: Mouse
سعر المنتج: 50

اسم المنتج أو done: done

النتيجة المتوقعة:

----- تقرير المنتجات -----
Keyboard: 100.00 ريال
Mouse: 50.00 ريال
عدد المنتجات: 2
الإجمالي قبل الضريبة: 150.00 ريال
الضريبة: 22.50 ريال
الإجمالي النهائي: 172.50 ريال
ماذا تعلمت؟ النتيجة تقريبًا مثل الدرس السابق، لكن الملف أصبح أكثر ترتيبًا وأسهل في التطوير.
توقف لحظة ✅ هل لاحظت أن البرنامج لم يتغير للمستخدم كثيرًا، لكن تغير كثيرًا من الداخل؟
12

تحدي صغير: أضف دالة ترحيب

أضف هذه الدالة قبل main:

def print_welcome():
    print("أهلًا بك في برنامج المشتريات")
    print("اكتب المنتجات، واكتب done عند الانتهاء")

ثم استدعها داخل main قبل بداية while:

    print_welcome()
هدف التحدي: تتدرب على وضع كل مهمة في دالة باسم واضح. رسالة الترحيب مهمة مستقلة عن الحساب وعن التقرير.
تحدي التفكير 🧠 أين تضع print_welcome؟ قبل main أم داخل main؟ تعريفها قبل main، واستدعاؤها داخل main.

اختبار نهاية الدرس

قبل الانتقال للدرس القادم، تأكد أنك فهمت هذه النقاط:

✅ فهمت لماذا نحتاج هيكلة المشروع.
✅ وضعت TAX_RATE في أعلى الملف.
✅ رتبت دوال الحساب في مكان واضح.
✅ أنشأت دالة create_product.
✅ فهمت أن print_report مسؤولة عن الطباعة فقط.
✅ عرفت أن main تجمع خطوات تشغيل البرنامج.
✅ شغلت البرنامج بآخر سطر main().
✅ أصبحت أقرب لكتابة مشروع نهائي منظم.
إذا فهمت هذه النقاط: فأنت الآن لا تكتب أوامر فقط، بل ترتب برنامجًا بطريقة يمكن تطويرها وتحسينها لاحقًا.

خلاصة الدرس

تعلمنا كيف نرتب برنامج المشتريات في ملف واضح. وضعنا الإعدادات في الأعلى، ثم الدوال، ثم main، ثم استدعاء main في نهاية الملف.

تذكر القاعدة:

إعدادات
دوال
main
تشغيل البرنامج

في الدرس القادم سنبدأ تحسين النسخة النهائية بإضافة قائمة أوامر بسيطة تجعل المستخدم يختار بين إضافة منتج، عرض تقرير، أو الخروج.