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

واجهة Comparable

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

بينما يخبرك == ما إذا كان كائنان متساويين، فأنت تحتاج أحياناً إلى معرفة أيهما يأتي أولاً. تسمح واجهة Comparable بفرز كائناتك من خلال تحديد ترتيب طبيعي.

لجعل الفئة قابلة للمقارنة، قم بتنفيذ Comparable<T> وقم بتجاوز الطريقة compareTo. تعيد هذه الطريقة رقماً سالباً إذا كان this يأتي قبل other، وصفراً إذا كانا متساويين، ورقماً موجباً إذا كان this يأتي بعد:

class Student implements Comparable<Student> {
  String name;
  int grade;
  
  Student(this.name, this.grade);
  
  @override
  int compareTo(Student other) {
    return grade.compareTo(other.grade);
  }
}

void main() {
  var students = [
    Student('Alice', 85),
    Student('Bob', 92),
    Student('Carol', 78),
  ];
  
  students.sort();
  
  for (var s in students) {
    print('${s.name}: ${s.grade}');
  }
  // كارول: 78، أليس: 85، بوب: 92
}

بمجرد أن تقوم الفئة (class) الخاصة بك بتنفيذ Comparable، يمكنك استخدام sort() دون توفير مقارن مخصص. الأنواع الرقمية والنصية المدمجة تنفذ بالفعل Comparable، وهذا هو السبب في أن grade.compareTo(other.grade) يعمل بشكل مباشر.

للترتيب التنازلي، ما عليك سوى عكس المقارنة عن طريق تبديل الكائنات أو نفي النتيجة:

@override
int compareTo(Student other) {
  return other.grade.compareTo(grade);  // تنازلي
}
challenge icon

التحدي

سهل

لنقم ببناء نظام إدارة مهام حيث يمكن فرز المهام حسب مستوى أولويتها! ستقوم بإنشاء فئة Task تقوم بتنفيذ واجهة Comparable، مما يسمح بفرز قائمة المهام تلقائياً من الأولوية الأعلى إلى الأقل.

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

  • task.dart: أنشئ فئة Task تمثل عنصراً في قائمة المهام مع name (String) و priority (int، حيث تعني الأرقام الأعلى أولوية أعلى). يجب أن تقوم المهمة بتنفيذ Comparable<Task> بحيث تظهر المهام عند فرزها بترتيب تنازلي حسب الأولوية (الأولوية الأعلى أولاً). قم أيضاً بإعادة كتابة (override) لـ toString() لإرجاع التنسيق: [name] (Priority: [priority])
  • main.dart: قم باستيراد ملف المهمة الخاص بك ووضح كيف تمكن واجهة Comparable من الفرز التلقائي. أنشئ قائمة تحتوي على هذه المهام الأربع:
    • 'Write report' بأولوية 2
    • 'Fix critical bug' بأولوية 5
    • 'Update documentation' بأولوية 1
    • 'Review code' بأولوية 3
    اطبع Before sorting:، ثم اطبع كل مهمة. قم بفرز القائمة باستخدام sort()، واطبع سطراً فارغاً، ثم اطبع After sorting: متبوعاً بكل مهمة مرة أخرى.

بما أن فئة Task الخاصة بك تقوم بتنفيذ Comparable، يمكنك استدعاء sort() مباشرة على القائمة دون تقديم مقارن مخصص. ستقوم المهام بترتيب نفسها تلقائياً بناءً على تنفيذك لـ compareTo!

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

Before sorting:
Write report (Priority: 2)
Fix critical bug (Priority: 5)
Update documentation (Priority: 1)
Review code (Priority: 3)

After sorting:
Fix critical bug (Priority: 5)
Review code (Priority: 3)
Write report (Priority: 2)
Update documentation (Priority: 1)

ورقة مرجعية

تسمح واجهة Comparable للكائنات بتعريف ترتيب طبيعي للفرز. قم بتنفيذ Comparable<T> وقم بتجاوز طريقة compareTo.

تُرجع طريقة compareTo ما يلي:

  • رقمًا سالبًا إذا كان this يأتي قبل other
  • صفرًا إذا كانا متساويين
  • رقمًا موجبًا إذا كان this يأتي بعد other

التنفيذ الأساسي (ترتيب تصاعدي):

class Student implements Comparable<Student> {
  String name;
  int grade;
  
  Student(this.name, this.grade);
  
  @override
  int compareTo(Student other) {
    return grade.compareTo(other.grade);
  }
}

بمجرد أن تقوم الفئة بتنفيذ Comparable، يمكنك استخدام sort() بدون مقارن مخصص:

var students = [
  Student('Alice', 85),
  Student('Bob', 92),
  Student('Carol', 78),
];

students.sort();  // Automatically uses compareTo

للترتيب التنازلي، اعكس المقارنة:

@override
int compareTo(Student other) {
  return other.grade.compareTo(grade);  // تنازلي
}

جرّب بنفسك

import 'task.dart';

void main() {
  // TODO: قم بإنشاء قائمة من كائنات Task تحتوي على ما يلي:
  // - 'Write report' مع أولوية 2
  // - 'Fix critical bug' مع أولوية 5
  // - 'Update documentation' مع أولوية 1
  // - 'Review code' مع أولوية 3
  
  List<Task> tasks = [
    // TODO: أضف المهام الأربعة هنا
  ];
  
  // TODO: اطبع "Before sorting:"
  // TODO: اطبع كل مهمة في القائمة
  
  // TODO: قم بفرز القائمة باستخدام sort()
  
  // TODO: اطبع سطراً فارغاً
  
  // TODO: اطبع "After sorting:"
  // TODO: اطبع كل مهمة في القائمة المفروزة
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming