OOP enum In Dart

✅ أولاً: ما هو enum؟

📘 التعريف:

enum (اختصار لـ enumeration) هو نوع بيانات مخصص يُستخدم لتعريف مجموعة من القيم الثابتة المحددة مسبقًا.

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

✅ الشكل العام لتعريف enum:
enum EnumName {
  value1,
  value2,
  value3,
}
Dart
✅ مثال 1: تمثيل أيام الأسبوع
enum WeekDay {
  Monday,
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
  Saturday,
  Sunday
}

void main() {
  WeekDay today = WeekDay.Monday;

  if (today == WeekDay.Monday) {
    print("اليوم هو الإثنين");
  }
}
Dart
✅ شرح المثال:
  • أنشأنا enum باسم WeekDay يحتوي على أيام الأسبوع.
  • المتغير today تم تعيينه إلى WeekDay.Monday.
  • فحصنا إذا كان اليوم هو الإثنين، وطبعنا رسالة.
✅ لماذا نستخدم enum بدلًا من Strings أو Integers؟
Strings/Integersenums
معرض للخطأ الإملائيمحمي من الأخطاء
يصعب التحقق منهسهل المقارنة
غير منظممنظم ومقروء
لا يدعم الميزات المتقدمةيدعم الوظائف والخصائص
✅ مثال 2: حالة الطلب (Order Status)
enum OrderStatus {
  pending,
  processing,
  shipped,
  delivered,
  canceled
}

void checkStatus(OrderStatus status) {
  switch (status) {
    case OrderStatus.pending:
      print("طلبك قيد الانتظار");
      break;
    case OrderStatus.processing:
      print("يتم تجهيز طلبك");
      break;
    case OrderStatus.shipped:
      print("تم شحن طلبك");
      break;
    case OrderStatus.delivered:
      print("تم توصيل طلبك");
      break;
    case OrderStatus.canceled:
      print("تم إلغاء الطلب");
      break;
  }
}

void main() {
  checkStatus(OrderStatus.processing); // يتم تجهيز طلبك
}
Dart
✅ أماكن وحالات الاستخدام
الاستخدامالمثال
🎮 حالات اللعبةمثل: فوز، خسارة، انتظار، جاري اللعب
📦 حالة الطلبقيد المعالجة، تم الشحن، تم الإلغاء
🚦 إشارات المرورأحمر، أصفر، أخضر
🔐 صلاحيات المستخدممدير، مشرف، مستخدم عادي
🎧 مشغل الموسيقىتشغيل، إيقاف، مؤقت
📱 نوع الجهازAndroid، iOS، Web
✅ خصائص متقدمة للـ enum (بدءًا من Dart 2.17)
1. استخدام الخصائص داخل enum:
enum Role {
  admin,
  moderator,
  user;

  bool get canDeleteUsers => this == Role.admin || this == Role.moderator;
}
Dart
void main() {
  print(Role.admin.canDeleteUsers);     // true
  print(Role.user.canDeleteUsers);      // false
}
Dart
2. إضافة قيم خاصة لكل عنصر:
enum Planet {
  Mercury(3.303e+23, 2.4397e6),
  Venus(4.869e+24, 6.0518e6),
  Earth(5.976e+24, 6.37814e6);

  final double mass;
  final double radius;

  const Planet(this.mass, this.radius);

  double get surfaceGravity {
    const G = 6.67300e-11;
    return G * mass / (radius * radius);
  }
}

void main() {
  print(Planet.Earth.surfaceGravity); // 9.802652743337129
}
Dart
✅ كيف نطبع أسماء القيم؟
print(Role.admin.name); // admin>
Dart
✅ كيف نحصل على جميع القيم؟
for (var role in Role.values) {
  print(role);
}
Dart
✅ تحويل String إلى enum (عكس .name):
Role fromString(String name) =>
  Role.values.firstWhere((e) => e.name == name, orElse: () => Role.user);

void main() {
  print(fromString("admin")); // Role.admin
}
Dart
✅ استخدام enum في switch داخل كلاس:
class User {
  final String name;
  final Role role;

  User(this.name, this.role);

  void printPermission() {
    switch (role) {
      case Role.admin:
        print("له كل الصلاحيات");
        break;
      case Role.moderator:
        print("له بعض الصلاحيات");
        break;
      case Role.user:
        print("صلاحيات محدودة");
        break;
    }
  }
}
Dart
✅ خلاصة شاملة:
العنصرالفائدة
enumينظم القيم الثابتة
nameإرجاع اسم القيمة كـ String
valuesإرجاع جميع القيم كـ List
switchتسهل المقارنة والتصرف حسب القيمة
الخصائصيمكنك إلحاق خصائص ودوال بالقيم