مشروع مصغر: إنشاء نظام بسيط لإدارة جهات الاتصال باستخدام الدوال


مشروع مصغر: إنشاء نظام بسيط لإدارة جهات الاتصال باستخدام الدوال

ماذا سنبني اليوم؟

اليوم، سنقوم ببناء نظام بسيط لإدارة جهات الاتصال باستخدام لغة بايثون، مع التركيز على تنظيم الكود باستخدام الدوال لتسهيل القراءة والصيانة. سنتعلم كيفية إضافة، عرض، وتعديل، وحذف جهات الاتصال بأسلوب برمجي منظم.

الخطوة 1: تهيئة الهيكل الأساسي وإضافة جهة اتصال

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

# قائمة عالمية لتخزين جهات الاتصال، كل جهة اتصال ستكون قاموساً
contacts = []
next_id = 1 # لإنشاء معرفات فريدة تلقائياً

def add_contact(name, phone, email):
    """
    دالة لإضافة جهة اتصال جديدة إلى القائمة.
    تتطلب: الاسم، رقم الهاتف، والبريد الإلكتروني.
    """
    global next_id
    contact = {
        "id": next_id, # معرف فريد لكل جهة اتصال
        "name": name,
        "phone": phone,
        "email": email
    }
    contacts.append(contact)
    next_id += 1
    print(f"تم إضافة جهة الاتصال: {name}")

# مثال على استخدام الدالة
# add_contact("أحمد علي", "0501234567", "ahmad@example.com")
# add_contact("فاطمة محمد", "0559876543", "fatima@example.com")
ملاحظة تقنية: استخدام قائمة من القواميس (List of Dictionaries) هو أسلوب شائع لتخزين البيانات المنظمة في بايثون، حيث يمثل كل قاموس كياناً (مثل جهة اتصال) بخصائص محددة (مفاتيح القاموس). المتغير next_id يضمن أن كل جهة اتصال تحصل على معرف فريد تلقائياً.

الخطوة 2: عرض جميع جهات الاتصال

بعد إضافة جهات الاتصال، نحتاج إلى طريقة لعرضها. سنقوم بإنشاء دالة view_contacts تقوم بالمرور على القائمة وطباعة تفاصيل كل جهة اتصال.

def view_contacts():
    """
    دالة لعرض جميع جهات الاتصال الموجودة في القائمة.
    """
    if not contacts:
        print("لا توجد جهات اتصال لعرضها.")
        return

    print("\n--- قائمة جهات الاتصال ---")
    for contact in contacts:
        print(f"ID: {contact['id']}, الاسم: {contact['name']}, الهاتف: {contact['phone']}, البريد الإلكتروني: {contact['email']}")
    print("--------------------------")

# أمثلة على استخدام الدوال
# add_contact("أحمد علي", "0501234567", "ahmad@example.com")
# add_contact("فاطمة محمد", "0559876543", "fatima@example.com")
# view_contacts()
ملاحظة تقنية: التحقق من أن القائمة ليست فارغة قبل محاولة عرض عناصرها هو ممارسة جيدة لتجنب الأخطاء وتحسين تجربة المستخدم، حيث يمنع طباعة عنوان فارغ للقائمة.

الخطوة 3: البحث، التحديث، والحذف

الآن، سنضيف الدوال الأساسية لإدارة جهات الاتصال: البحث عن جهة اتصال بواسطة معرفها (ID)، تحديث معلوماتها، وحذفها من القائمة.

def find_contact(contact_id):
    """
    دالة للبحث عن جهة اتصال بواسطة معرفها الفريد (ID).
    تعيد القاموس الخاص بجهة الاتصال إذا وجدت، وإلا تعيد None.
    """
    for contact in contacts:
        if contact['id'] == contact_id:
            return contact
    return None

def update_contact(contact_id, new_name=None, new_phone=None, new_email=None):
    """
    دالة لتحديث معلومات جهة اتصال موجودة.
    تتطلب: معرف جهة الاتصال (ID) وأي من المعلومات الجديدة للتحديث.
    """
    contact = find_contact(contact_id)
    if contact:
        if new_name:
            contact['name'] = new_name
        if new_phone:
            contact['phone'] = new_phone
        if new_email:
            contact['email'] = new_email
        print(f"تم تحديث جهة الاتصال ID: {contact_id}")
    else:
        print(f"جهة الاتصال بالمعرف {contact_id} غير موجودة.")

def delete_contact(contact_id):
    """
    دالة لحذف جهة اتصال من القائمة بواسطة معرفها (ID).
    """
    global contacts # لتمكين تعديل القائمة العالمية
    initial_len = len(contacts)
    contacts = [contact for contact in contacts if contact['id'] != contact_id]
    if len(contacts) < initial_len:
        print(f"تم حذف جهة الاتصال ID: {contact_id}")
    else:
        print(f"جهة الاتصال بالمعرف {contact_id} غير موجودة.")

# أمثلة على استخدام الدوال
# add_contact("علياء", "0501112233", "alyaa@example.com") # ID: 3
# update_contact(3, new_phone="0504445566")
# delete_contact(1)
# view_contacts()
ملاحظة تقنية: استخدام تعبير القائمة (list comprehension) مثل [contact for contact in contacts if contact['id'] != contact_id] هو طريقة فعالة ومختصرة لإنشاء قائمة جديدة تستثني العنصر المراد حذفه. استخدام global contacts ضروري هنا لإعادة تعيين المتغير contacts على مستوى النطاق العام.

الكود النهائي الكامل

إليك الكود المجمع الذي يضم جميع الدوال التي بنيناها، بالإضافة إلى قائمة تفاعلية بسيطة (main_menu) لتجربة النظام.

# قائمة عالمية لتخزين جهات الاتصال، كل جهة اتصال ستكون قاموساً
contacts = []
next_id = 1 # لإنشاء معرفات فريدة تلقائياً

def add_contact(name, phone, email):
    """
    دالة لإضافة جهة اتصال جديدة إلى القائمة.
    تتطلب: الاسم، رقم الهاتف، والبريد الإلكتروني.
    """
    global next_id
    contact = {
        "id": next_id, # معرف فريد لكل جهة اتصال
        "name": name,
        "phone": phone,
        "email": email
    }
    contacts.append(contact)
    next_id += 1
    print(f"تم إضافة جهة الاتصال: {name}")

def view_contacts():
    """
    دالة لعرض جميع جهات الاتصال الموجودة في القائمة.
    """
    if not contacts:
        print("لا توجد جهات اتصال لعرضها.")
        return

    print("\n--- قائمة جهات الاتصال ---")
    for contact in contacts:
        print(f"ID: {contact['id']}, الاسم: {contact['name']}, الهاتف: {contact['phone']}, البريد الإلكتروني: {contact['email']}")
    print("--------------------------")

def find_contact(contact_id):
    """
    دالة للبحث عن جهة اتصال بواسطة معرفها الفريد (ID).
    تعيد القاموس الخاص بجهة الاتصال إذا وجدت، وإلا تعيد None.
    """
    for contact in contacts:
        if contact['id'] == contact_id:
            return contact
    return None

def update_contact(contact_id, new_name=None, new_phone=None, new_email=None):
    """
    دالة لتحديث معلومات جهة اتصال موجودة.
    تتطلب: معرف جهة الاتصال (ID) وأي من المعلومات الجديدة للتحديث.
    """
    contact = find_contact(contact_id)
    if contact:
        if new_name:
            contact['name'] = new_name
        if new_phone:
            contact['phone'] = new_phone
        if new_email:
            contact['email'] = new_email
        print(f"تم تحديث جهة الاتصال ID: {contact_id}")
    else:
        print(f"جهة الاتصال بالمعرف {contact_id} غير موجودة.")

def delete_contact(contact_id):
    """
    دالة لحذف جهة اتصال من القائمة بواسطة معرفها (ID).
    """
    global contacts # لتمكين تعديل القائمة العالمية
    initial_len = len(contacts)
    contacts = [contact for contact in contacts if contact['id'] != contact_id]
    if len(contacts) < initial_len:
        print(f"تم حذف جهة الاتصال ID: {contact_id}")
    else:
        print(f"جهة الاتصال بالمعرف {contact_id} غير موجودة.")

def main_menu():
    """
    القائمة الرئيسية للتفاعل مع نظام إدارة جهات الاتصال.
    """
    while True:
        print("\n--- نظام إدارة جهات الاتصال ---")
        print("1. إضافة جهة اتصال")
        print("2. عرض جميع جهات الاتصال")
        print("3. تحديث جهة اتصال")
        print("4. حذف جهة اتصال")
        print("5. خروج")

        choice = input("الرجاء اختيار عملية (1-5): ")

        if choice == '1':
            name = input("أدخل الاسم: ")
            phone = input("أدخل رقم الهاتف: ")
            email = input("أدخل البريد الإلكتروني: ")
            add_contact(name, phone, email)
        elif choice == '2':
            view_contacts()
        elif choice == '3':
            try:
                contact_id = int(input("أدخل معرف جهة الاتصال للتحديث: "))
                new_name = input("أدخل الاسم الجديد (اتركه فارغاً للتخطي): ")
                new_phone = input("أدخل رقم الهاتف الجديد (اتركه فارغاً للتخطي): ")
                new_email = input("أدخل البريد الإلكتروني الجديد (اتركه فارغاً للتخطي): ")
                update_contact(contact_id, new_name or None, new_phone or None, new_email or None)
            except ValueError:
                print("معرف جهة الاتصال يجب أن يكون رقماً صحيحاً.")
        elif choice == '4':
            try:
                contact_id = int(input("أدخل معرف جهة الاتصال للحذف: "))
                delete_contact(contact_id)
            except ValueError:
                print("معرف جهة الاتصال يجب أن يكون رقماً صحيحاً.")
        elif choice == '5':
            print("شكراً لاستخدامك نظام إدارة جهات الاتصال. إلى اللقاء!")
            break
        else:
            print("اختيار غير صالح، الرجاء المحاولة مرة أخرى.")

# تشغيل القائمة الرئيسية عند بدء السكربت
if __name__ == "__main__":
    main_menu()

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

بعد تشغيل السكربت، ستظهر لك قائمة تفاعلية في سطر الأوامر (Terminal) تتيح لك اختيار العمليات المختلفة. يمكنك إضافة جهات اتصال جديدة، عرض القائمة الحالية، تحديث معلومات جهة اتصال موجودة، أو حذف جهة اتصال. ستظهر رسائل تأكيد أو خطأ بناءً على كل عملية تقوم بها، مما يوفر تجربة إدارة جهات اتصال بسيطة وفعالة.