Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التعدادات مع الدوال (Enums with Methods)

جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 88 من 110.

في Dart، لا تُعد الـ enums مجرد قوائم بسيطة من الثوابت - بل يمكن أن تحتوي على حقول (fields)، ومنشئات (constructors)، ودوال (methods)، مما يجعلها فئات مصغرة (mini-classes) قوية. يُطلق على هذا اسم enhanced enums، وهي تتيح لك إرفاق سلوك وبيانات مباشرة بكل قيمة من قيم الـ enum.

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  
  const Status(this.displayName);
  
  bool get isFinalized => this == approved || this == rejected;
}

void main() {
  var status = Status.pending;
  print(status.displayName);    // Waiting
  print(status.isFinalized);    // false
  
  print(Status.approved.isFinalized);  // true
}

تستدعي كل قيمة enum المنشئ (constructor) مع وسيطاتها المحددة. يجب أن يكون المنشئ const، ويجب أن تكون جميع الحقول final. يمكنك إضافة دوال جلب (getters) ووسائل (methods) تعمل مع بيانات الـ enum أو تقارنها بالقيم الأخرى.

يمكن للتعدادات المحسنة (Enhanced enums) أيضًا تنفيذ الواجهات، مما يمنحها مرونة أكبر:

enum Priority implements Comparable<Priority> {
  low(1),
  medium(2),
  high(3);

  final int level;
  const Priority(this.level);

  @override
  int compareTo(Priority other) => level.compareTo(other.level);
}

void main() {
  var tasks = [Priority.high, Priority.low, Priority.medium];
  tasks.sort();
  print(tasks);  // [Priority.low, Priority.medium, Priority.high]
}

تعد التعدادات المحسنة (Enhanced enums) مثالية عندما يكون لديك مجموعة ثابتة من القيم التي يحتاج كل منها إلى بيانات أو سلوكيات مرتبطة بها - مثل أكواد الحالة مع الرسائل، أو الأولويات مع المستويات، أو الاتجاهات مع الإحداثيات.

challenge icon

التحدي

سهل

لنقم ببناء نظام لإدارة المهام باستخدام التعدادات المحسنة (enhanced enums)! ستقوم بإنشاء enum يمثل فئات مهام مختلفة، لكل منها خصائصها وسلوكياتها الخاصة التي تساعد في تنظيم العمل وترتيب أولوياته.

ستقوم بتنظيم الكود الخاص بك في ملفين:

  • task_category.dart: قم بإنشاء enum محسن يسمى TaskCategory يمثل أنواعًا مختلفة من المهام في المشروع. يجب أن تحتوي كل فئة على:
    • حقل String label لاسم مقروء بشريًا
    • حقل int priority (حيث 1 هو أعلى أولوية، و 3 هو أدنى أولوية)
    • منشئ const يقوم بتهيئة كلا الحقلين
    • أربع قيم enum: bug (label: "Bug Fix"، priority: 1)، و feature (label: "New Feature"، priority: 2)، و documentation (label: "Documentation"، priority: 3)، و testing (label: "Testing"، priority: 2)
    • مسترجع (getter) باسم isUrgent يعيد true إذا كانت الأولوية 1
    • دالة describe() تعيد سلسلة نصية بالتنسيق التالي: [label] (Priority: [priority])
    يجب أن يقوم الـ enum الخاص بك أيضًا بتنفيذ Comparable<TaskCategory> بحيث يمكن فرز المهام حسب الأولوية (رقم الأولوية الأقل = يأتي أولاً).
  • main.dart: قم باستيراد enum فئة المهام واستعرض قدراته:
    • أنشئ قائمة تحتوي على جميع فئات المهام الأربع بهذا الترتيب: feature، bug، documentation، testing
    • اطبع وصف كل فئة باستخدام دالة describe()، كل منها في سطر منفصل
    • اطبع سطرًا فارغًا
    • قم بفرز القائمة حسب الأولوية واطبع After sorting by priority:
    • اطبع تسمية (label) كل فئة تم فرزها، كل منها في سطر منفصل
    • اطبع سطرًا فارغًا
    • اطبع Urgent tasks:
    • قم بالمرور عبر الترتيب الأصلي (feature، bug، documentation، testing) واطبع فقط تسميات الفئات التي يكون فيها isUrgent صحيحًا (true)

يجمع هذا التحدي بين ميزات الـ enum المحسنة: الحقول، والمنشئات، والمسترجعات، والدوال، وتنفيذ الواجهات - وكلها تعمل معًا لإنشاء نظام مفيد لتصنيف المهام!

المخرجات المتوقعة:

New Feature (Priority: 2)
Bug Fix (Priority: 1)
Documentation (Priority: 3)
Testing (Priority: 2)

After sorting by priority:
Bug Fix
New Feature
Testing
Documentation

Urgent tasks:
Bug Fix

ورقة مرجعية

يمكن أن تحتوي التعدادات المحسنة (Enhanced enums) في Dart على حقول، ومنشئات (constructors)، ودوال (methods)، مما يجعلها فئات مصغرة قوية تربط السلوك والبيانات بكل قيمة من قيم التعداد.

تعداد محسن أساسي مع حقول ومنشئ:

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  
  const Status(this.displayName);
}

المتطلبات الأساسية:

  • يجب أن يكون المنشئ const
  • يجب أن تكون جميع الحقول final
  • كل قيمة من قيم التعداد تستدعي المنشئ بوسائط محددة

يمكن أن تتضمن التعدادات المحسنة دوال جلب (getters) ودوال (methods):

enum Status {
  pending('Waiting'),
  approved('Accepted'),
  rejected('Denied');

  final String displayName;
  const Status(this.displayName);
  
  bool get isFinalized => this == approved || this == rejected;
}

يمكن للتعدادات المحسنة تنفيذ واجهات (interfaces) مثل Comparable:

enum Priority implements Comparable<Priority> {
  low(1),
  medium(2),
  high(3);

  final int level;
  const Priority(this.level);

  @override
  int compareTo(Priority other) => level.compareTo(other.level);
}

استخدم التعدادات المحسنة عندما يكون لديك مجموعة ثابتة من القيم التي تحتاج كل منها إلى بيانات أو سلوك مرتبط بها.

جرّب بنفسك

import 'task_category.dart';

void main() {
  // TODO: قم بإنشاء قائمة تحتوي على جميع فئات المهام الأربع بهذا الترتيب:
  // feature, bug, documentation, testing
  
  // TODO: اطبع وصف كل فئة باستخدام ()describe، وصف واحد في كل سطر
  
  // TODO: اطبع سطراً فارغاً
  
  // TODO: قم بفرز القائمة حسب الأولوية (priority)
  
  // TODO: "After sorting by priority:" اطبع
  
  // TODO: اطبع تسمية (label) كل فئة تم فرزها، واحدة في كل سطر
  
  // TODO: اطبع سطراً فارغاً
  
  // TODO: "Urgent tasks:" اطبع
  
  // TODO: قم بالمرور عبر الترتيب الأصلي (feature, bug, documentation, testing)
  // واطبع فقط تسميات الفئات التي تكون فيها قيمة isUrgent هي true
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming