شرح شامل لـ Enum في لغة C: دليلك الكامل لتحسين الكود

1. مقدمة

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

2. ما هو enum؟

تعريف ودور enum

يُطلق على enum اسم “النوع العددي” وهو نوع بيانات يُستخدم لتعريف مجموعة من الثوابت. عادةً ما يُستخدم لإعطاء أسماء سهلة التمييز لعدة ثوابت ذات صلة. على سبيل المثال، عند التعامل مع الألوان في برنامج، فإن إدارتها بالأرقام غير بديهية. ومع ذلك، باستخدام enum، يمكنك تعريف الألوان بأسماء مثل RED وGREEN وBLUE.

لماذا نستخدم enum؟

باستخدام enum، يمكنك الحصول على الفوائد التالية:

  • تحسين قابلية قراءة التعليمات البرمجية: نظرًا لأنه يمكن التعبير عن القيم بالأسماء بدلاً من الأرقام، يصبح فهم التعليمات البرمجية أسهل.
  • سهولة الصيانة: حتى إذا تغيرت مجموعة الثوابت، فإن استخدام enum يقلل من تأثير التغييرات على التعليمات البرمجية بأكملها.
  • الوقاية من الأخطاء: إذا كنت ترغب في حصر القيم بقيم معينة، فإن استخدام enum يمنع استخدام القيم الخاطئة.
侍エンジニア塾

3. الاستخدام الأساسي لـ enum

طريقة تعريف enum

يتم تعريف enum الأساسي على النحو التالي:

enum { RED, GREEN, BLUE };

في هذه الحالة، يتم تعيين RED تلقائيًا إلى 0، وGREEN إلى 1، وBLUE إلى 2. إذا كنت ترغب في تسمية enum، فسيتم وصفه على النحو التالي:

enum Color { RED, GREEN, BLUE };

لقد أنشأت enum باسم Color، ويمكنك استخدام هذا الاسم لتعريف المتغيرات.

نموذج تعليمات برمجية فعلية

فيما يلي نموذج بسيط للتعليمات البرمجية باستخدام enum:

#include <stdio.h>

enum Color { RED, GREEN, BLUE };

int main() {
    enum Color color;
    color = RED;
    printf("%dn", color); // الإخراج: 0
    return 0;
}

في هذه التعليمات البرمجية، يتم إخراج RED على أنه 0.

4. الاستخدام المتقدم لـ enum

التعيين التلقائي والتعيين اليدوي لقيم enum

يقوم enum بتعيين القيم تلقائيًا بدءًا من 0، 1، 2… افتراضيًا. ومع ذلك، من الممكن أيضًا تعيين قيم محددة يدويًا.

enum Days {
    MONDAY = 1,
    TUESDAY,
    WEDNESDAY,
    THURSDAY = 10,
    FRIDAY
};

في هذا المثال، تم تعيين MONDAY إلى 1، وTUESDAY إلى 2، وTHURSDAY إلى 10. سيتم تعيين FRIDAY تلقائيًا إلى 11.

استخدام enum في جملة switch-case

غالبًا ما يتم استخدام enum مع جملة switch-case. باستخدام enum، تصبح تعليمات البرمجية للفرع الشرطي أكثر وضوحًا.

enum Color { RED, GREEN, BLUE };

int main() {
    enum Color color = BLUE;

    switch(color) {
        case RED:
            printf("Redn");
            break;
        case GREEN:
            printf("Greenn");
            break;
        case BLUE:
            printf("Bluen");
            break;
        default:
            printf("Unknown colorn");
    }
    return 0;
}

في هذه التعليمات البرمجية، يتم عرض رسائل مختلفة اعتمادًا على قيمة المتغير color. باستخدام أعضاء enum في جملة switch-case، يتم تحسين قابلية قراءة التعليمات البرمجية.

استخدام enum كمؤشر مصفوفة

يمكن أيضًا استخدام enum كمؤشر لمصفوفة.

enum Color { RED, GREEN, BLUE };
char* color_names[] = { "Red", "Green", "Blue" };

printf("%sn", color_names[RED]); // الإخراج: Red

في هذه التعليمات البرمجية، يتم الحصول على سلسلة نصية معينة من مصفوفة باستخدام قيمة enum.

5. ملاحظات وأفضل الممارسات لـ enum

تكرار القيم والقيم خارج النطاق

يُسمح بتكرار القيم داخل enum، ولكن يجب تجنبه من منظور قابلية قراءة التعليمات البرمجية وسهولة صيانتها.

enum Days {
    MONDAY = 1,
    FRIDAY = 1
};

في هذه الحالة، سيكون لـ MONDAY وFRIDAY نفس القيمة، ولكن قد يؤدي ذلك إلى سلوك غير مقصود. بالإضافة إلى ذلك، من الممكن تعيين قيم غير معرفة في enum، ولكن يجب تجنب ذلك أيضًا.

enum Days { MONDAY = 1, TUESDAY = 2 };
enum Days day = 8; // لن يؤدي ذلك إلى خطأ في الترجمة

تحسين قابلية قراءة التعليمات البرمجية باستخدام enum

يجب استخدام enum بنشاط لتحسين قابلية قراءة التعليمات البرمجية. استخدام enum يجعل القصد أكثر وضوحًا ويمنع الأخطاء مقارنة بالفرع الشرطي بالأرقام.

6. أمثلة على التعليمات البرمجية التي تستخدم enum

مقارنة التعليمات البرمجية بدون enum ومع enum

دعونا نقارن التعليمات البرمجية بدون enum ومع enum.

عند عدم استخدام enum

void findNearest(int day) {
    switch(day) {
        case 0:
            printf("اليومn");
            break;
        case 1:
            printf("قبل يومn");
            break;
        // تم الحذف
    }
}

عند استخدام enum

enum Days { TODAY, YESTERDAY };

void findNearest(Days day) {
    switch(day) {
        case TODAY:
            printf("اليومn");
            break;
        case YESTERDAY:
            printf("قبل يومn");
            break;
        // تم الحذف
    }
}

باستخدام enum، يصبح قصد التعليمات البرمجية أكثر وضوحًا وتتحسن قابليتها للقراءة.

7. الخلاصة

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