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


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

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

سنتعلم كيفية نمذجة الكائنات الحقيقية كفئات (Classes) وكيفية تفاعلها مع بعضها البعض لإنجاز وظائف النظام.

الخطوة 1: تعريف الفئة Task (المهمة)

لنبدأ بإنشاء الفئة الأساسية لنظامنا: Task. ستمثل هذه الفئة مهمة فردية ولها خصائص مثل الوصف وتاريخ الاستحقاق والحالة.

ملاحظة تقنية: استخدام الفئات يساعدنا على تجميع البيانات (الخصائص) والوظائف (الأساليب) التي تتعلق بكائن معين في مكان واحد، مما يعزز من تنظيم الكود وقابليته للقراءة.

إليك الكود:

import datetime # لاستخدام كائنات التاريخ والوقت (غير مستخدمة بشكل مباشر في هذا المثال ولكن مفيدة للتوسع)

class Task:
    """
    يمثل هذا الصف مهمة فردية في نظام إدارة المهام.
    """
    def __init__(self, description, due_date=None):
        """
        مهيئ الكائن Task.

        :param description: وصف المهمة (نص).
        :param due_date: تاريخ استحقاق المهمة (اختياري، نص).
        """
        self.description = description
        self.due_date = due_date
        self.status = "معلقة" # الحالة الافتراضية للمهمة هي "معلقة"

    def mark_as_completed(self):
        """
        يغير حالة المهمة إلى "مكتملة".
        """
        self.status = "مكتملة"

    def __str__(self):
        """
        يمثل الكائن Task كسلسلة نصية قابلة للقراءة.
        """
        return f"المهمة: {self.description} | تاريخ الاستحقاق: {self.due_date if self.due_date else 'غير محدد'} | الحالة: {self.status}"

الخطوة 2: تعريف الفئة TaskManager (مدير المهام)

الآن، بعد أن أصبح لدينا طريقة لتمثيل المهام، نحتاج إلى فئة لإدارة مجموعة من هذه المهام. ستكون الفئة TaskManager مسؤولة عن إضافة المهام وعرضها وتحديث حالتها.

ملاحظة تقنية: هذه الفئة تطبق مبدأ "التجميع" (Composition) في OOP، حيث تحتوي على كائنات من فئة أخرى (Task) وتديرها.

إليك الكود:

class TaskManager:
    """
    يمثل هذا الصف مدير المهام الذي يدير مجموعة من كائنات Task.
    """
    def __init__(self):
        """
        مهيئ الكائن TaskManager.
        يحتوي على قائمة فارغة لتخزين المهام.
        """
        self.tasks = [] # قائمة لتخزين كائنات Task

    def add_task(self, description, due_date=None):
        """
        يضيف مهمة جديدة إلى قائمة المهام.

        :param description: وصف المهمة.
        :param due_date: تاريخ استحقاق المهمة (اختياري).
        """
        new_task = Task(description, due_date) # إنشاء كائن Task جديد
        self.tasks.append(new_task) # إضافة المهمة إلى القائمة
        print(f"تمت إضافة المهمة: '{description}' بنجاح.")

    def view_tasks(self):
        """
        يعرض جميع المهام الموجودة مع حالتها.
        """
        if not self.tasks:
            print("لا توجد مهام حالياً.")
            return

        print("\nقائمة المهام:")
        for i, task in enumerate(self.tasks):
            print(f"{i + 1}. {task}") # عرض كل مهمة باستخدام تمثيلها النصي (__str__)

    def update_task_status(self, task_index, new_status="مكتملة"):
        """
        يقوم بتحديث حالة مهمة معينة.

        :param task_index: فهرس المهمة في القائمة (يبدأ من 1).
        :param new_status: الحالة الجديدة للمهمة (افتراضياً "مكتملة").
        """
        if 0 < task_index <= len(self.tasks):
            task = self.tasks[task_index - 1] # الحصول على المهمة باستخدام الفهرس (نطرح 1 لأن الفهارس تبدأ من 0)
            if new_status == "مكتملة":
                task.mark_as_completed() # استخدام طريقة mark_as_completed لتغيير الحالة
                print(f"تم تحديث حالة المهمة '{task.description}' إلى 'مكتملة'.")
            else:
                # يمكن إضافة منطق لحالات أخرى إذا لزم الأمر في المستقبل
                print("حالة غير صالحة للتحديث. يمكن فقط تحديد 'مكتملة' حالياً.")
        else:
            print("فهرس المهمة غير صالح.")

الخطوة 3: تجميع المكونات واختبار النظام

الآن بعد أن أصبح لدينا الفئات Task و TaskManager، حان الوقت لإنشاء مثيل لمدير المهام والتفاعل معه لإضافة المهام وعرضها وتحديثها.

# إنشاء مثيل لمدير المهام
manager = TaskManager()

# إضافة بعض المهام
manager.add_task("شراء البقالة", "2023-12-25")
manager.add_task("الانتهاء من تقرير المشروع", "2023-12-20")
manager.add_task("ممارسة الرياضة")

# عرض جميع المهام
manager.view_tasks()

# تحديث حالة مهمة (المهمة الأولى)
manager.update_task_status(1) # المهمة الأولى هي "شراء البقالة"

# عرض المهام مرة أخرى لرؤية التغيير
manager.view_tasks()

# محاولة تحديث مهمة غير موجودة
manager.update_task_status(5)

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

إليك الكود الكامل لنظام إدارة المهام المتكامل:

import datetime

class Task:
    """
    يمثل هذا الصف مهمة فردية في نظام إدارة المهام.
    """
    def __init__(self, description, due_date=None):
        """
        مهيئ الكائن Task.

        :param description: وصف المهمة (نص).
        :param due_date: تاريخ استحقاق المهمة (اختياري، نص).
        """
        self.description = description
        self.due_date = due_date
        self.status = "معلقة" # الحالة الافتراضية للمهمة هي "معلقة"

    def mark_as_completed(self):
        """
        يغير حالة المهمة إلى "مكتملة".
        """
        self.status = "مكتملة"

    def __str__(self):
        """
        يمثل الكائن Task كسلسلة نصية قابلة للقراءة.
        """
        return f"المهمة: {self.description} | تاريخ الاستحقاق: {self.due_date if self.due_date else 'غير محدد'} | الحالة: {self.status}"

class TaskManager:
    """
    يمثل هذا الصف مدير المهام الذي يدير مجموعة من كائنات Task.
    """
    def __init__(self):
        """
        مهيئ الكائن TaskManager.
        يحتوي على قائمة فارغة لتخزين المهام.
        """
        self.tasks = [] # قائمة لتخزين كائنات Task

    def add_task(self, description, due_date=None):
        """
        يضيف مهمة جديدة إلى قائمة المهام.

        :param description: وصف المهمة.
        :param due_date: تاريخ استحقاق المهمة (اختياري).
        """
        new_task = Task(description, due_date) # إنشاء كائن Task جديد
        self.tasks.append(new_task) # إضافة المهمة إلى القائمة
        print(f"تمت إضافة المهمة: '{description}' بنجاح.")

    def view_tasks(self):
        """
        يعرض جميع المهام الموجودة مع حالتها.
        """
        if not self.tasks:
            print("لا توجد مهام حالياً.")
            return

        print("\nقائمة المهام:")
        for i, task in enumerate(self.tasks):
            print(f"{i + 1}. {task}") # عرض كل مهمة باستخدام تمثيلها النصي (__str__)

    def update_task_status(self, task_index, new_status="مكتملة"):
        """
        يقوم بتحديث حالة مهمة معينة.

        :param task_index: فهرس المهمة في القائمة (يبدأ من 1).
        :param new_status: الحالة الجديدة للمهمة (افتراضياً "مكتملة").
        """
        if 0 < task_index <= len(self.tasks):
            task = self.tasks[task_index - 1] # الحصول على المهمة باستخدام الفهرس (نطرح 1 لأن الفهارس تبدأ من 0)
            if new_status == "مكتملة":
                task.mark_as_completed() # استخدام طريقة mark_as_completed لتغيير الحالة
                print(f"تم تحديث حالة المهمة '{task.description}' إلى 'مكتملة'.")
            else:
                # يمكن إضافة منطق لحالات أخرى إذا لزم الأمر في المستقبل
                print("حالة غير صالحة للتحديث. يمكن فقط تحديد 'مكتملة' حالياً.")
        else:
            print("فهرس المهمة غير صالح.")

# --- الجزء الخاص بتشغيل النظام والتفاعل معه ---
if __name__ == "__main__":
    # إنشاء مثيل لمدير المهام
    manager = TaskManager()

    # إضافة بعض المهام
    manager.add_task("شراء البقالة", "2023-12-25")
    manager.add_task("الانتهاء من تقرير المشروع", "2023-12-20")
    manager.add_task("ممارسة الرياضة")

    # عرض جميع المهام
    manager.view_tasks()

    # تحديث حالة مهمة
    manager.update_task_status(1) # المهمة الأولى (شراء البقالة)

    # عرض المهام مرة أخرى لرؤية التغيير
    manager.view_tasks()

    # محاولة تحديث مهمة غير موجودة
    manager.update_task_status(5)

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

عند تشغيل السكربت أعلاه في طرفية بايثون، ستحصل على مخرجات مشابهة لما يلي:

تمت إضافة المهمة: 'شراء البقالة' بنجاح.
تمت إضافة المهمة: 'الانتهاء من تقرير المشروع' بنجاح.
تمت إضافة المهمة: 'ممارسة الرياضة' بنجاح.

قائمة المهام:
1. المهمة: شراء البقالة | تاريخ الاستحقاق: 2023-12-25 | الحالة: معلقة
2. المهمة: الانتهاء من تقرير المشروع | تاريخ الاستحقاق: 2023-12-20 | الحالة: معلقة
3. المهمة: ممارسة الرياضة | تاريخ الاستحقاق: غير محدد | الحالة: معلقة
تم تحديث حالة المهمة 'شراء البقالة' إلى 'مكتملة'.

قائمة المهام:
1. المهمة: شراء البقالة | تاريخ الاستحقاق: 2023-12-25 | الحالة: مكتملة
2. المهمة: الانتهاء من تقرير المشروع | تاريخ الاستحقاق: 2023-12-20 | الحالة: معلقة
3. المهمة: ممارسة الرياضة | تاريخ الاستحقاق: غير محدد | الحالة: معلقة
فهرس المهمة غير صالح.