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

السجلات (Records - Dart 3)

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

قدمت Dart 3 السجلات (records) - وهي طريقة خفيفة الوزن لتجميع قيم متعددة معاً دون إنشاء فئة (class) كاملة. السجلات غير قابلة للتغيير، وتتمتع بميزة المساواة المدمجة، وهي مثالية لإرجاع قيم متعددة من دالة (function) أو تجميع البيانات ذات الصلة بشكل مؤقت.

أنشئ سجلاً (record) من خلال إحاطة القيم بين قوسين:

void main() {
  // سجل بسيط بقيمتين
  var point = (10, 20);
  print(point.$1);  // 10 - الوصول إلى العنصر الأول
  print(point.$2);  // 20 - الوصول إلى العنصر الثاني
  
  // سجلات بحقول مسماة
  var person = (name: 'Alice', age: 30);
  print(person.name);  // Alice
  print(person.age);   // 30
}

يتم الوصول إلى الحقول الموضعية باستخدام $1 و $2 وما إلى ذلك، بينما تستخدم الحقول المسماة أسماءها مباشرة. يمكنك الجمع بين كلا الأسلوبين في سجل واحد.

تتألق السجلات (Records) عند إرجاع قيم متعددة من الدوال - لا داعي لإنشاء فئة (class) لمجرد إرجاع قطعتين من البيانات:

(int, int) divideWithRemainder(int a, int b) {
  return (a ~/ b, a % b);
}

(String name, int age) getUser() {
  return ('Bob', 25);
}

void main() {
  var (quotient, remainder) = divideWithRemainder(17, 5);
  print('$quotient remainder $remainder');  // 3 الباقي 2
  
  var (name, age) = getUser();
  print('$name is $age');  // Bob يبلغ من العمر 25
}

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

challenge icon

التحدي

سهل

لنقم ببناء نظام إحداثيات باستخدام السجلات (records)! ستقوم بإنشاء دوال تتعامل مع نقاط ثنائية الأبعاد متمثلة في سجلات، مما يوضح كيف تسهل السجلات إرجاع والتعامل مع قيم متعددة مرتبطة ببعضها البعض دون الحاجة لإنشاء فئات (classes) كاملة.

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

  • geometry.dart: أنشئ دوال تستخدم السجلات للتعامل مع بيانات الإحداثيات:
    • دالة createPoint(int x, int y) تعيد سجلاً بحقول مسمى x و y. يجب أن يكون نوع الإرجاع ({int x, int y})
    • دالة midpoint(({int x, int y}) p1, ({int x, int y}) p2) تحسب وتعيد نقطة المنتصف بين نقطتين كسجل بحقول مسمى. استخدم القسمة الصحيحة (~/) للحساب
    • دالة distance(({int x, int y}) p1, ({int x, int y}) p2) تعيد سجلاً بحقول موضعية (positional fields): المسافة الأفقية (الفرق في x) والمسافة الرأسية (الفرق في y). يجب أن يكون نوع الإرجاع (int, int). احسبها كـ p2.x - p1.x و p2.y - p1.y
  • main.dart: استورد ملف الهندسة الخاص بك واستعرض السجلات قيد التنفيذ:
    • أنشئ نقطتين باستخدام createPoint: النقطة A عند (2, 4) والنقطة B عند (10, 8)
    • اطبع Point A: ([x], [y]) باستخدام الحقول المسمى
    • اطبع Point B: ([x], [y]) باستخدام الحقول المسمى
    • احسب نقطة المنتصف واطبع Midpoint: ([x], [y])
    • احسب المسافة واستخدم التفكيك (destructuring) لاستخراج القيم إلى المتغيرات dx و dy، ثم اطبع Distance: dx=[dx], dy=[dy]

لاحظ كيف تسمح لك السجلات بإرجاع قيم متعددة بشكل نظيف - حقول مسمى للوضوح عندما يكون المعنى مهماً، وحقول موضعية عندما يكون السياق واضحاً!

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

Point A: (2, 4)
Point B: (10, 8)
Midpoint: (6, 6)
Distance: dx=8, dy=4

ورقة مرجعية

قدم Dart 3 السجلات (records) - وهي طريقة خفيفة الوزن لتجميع قيم متعددة معاً دون إنشاء فئة (class) كاملة. السجلات غير قابلة للتغيير (immutable) ومثالية لإرجاع قيم متعددة من دالة.

قم بإنشاء سجل عن طريق وضع القيم بين قوسين:

// سجل بسيط بحقول موضعية
var point = (10, 20);
print(point.$1);  // 10 - الوصول إلى العنصر الأول
print(point.$2);  // 20 - الوصول إلى العنصر الثاني

// سجلات بحقول مسماة
var person = (name: 'Alice', age: 30);
print(person.name);  // Alice
print(person.age);   // 30

يتم الوصول إلى الحقول الموضعية باستخدام $1 و $2 وما إلى ذلك، بينما تستخدم الحقول المسماة أسماءها مباشرة.

السجلات مثالية لإرجاع قيم متعددة من الدوال:

// نوع الإرجاع يحدد هيكل السجل
(int, int) divideWithRemainder(int a, int b) {
  return (a ~/ b, a % b);
}

// حقول مسماة في نوع الإرجاع
(String name, int age) getUser() {
  return ('Bob', 25);
}

// تفكيك السجلات (Destructuring)
var (quotient, remainder) = divideWithRemainder(17, 5);
print('$quotient remainder $remainder');  // 3 remainder 2

var (name, age) = getUser();
print('$name is $age');  // Bob is 25

تستخدم أنواع إرجاع السجلات ذات الحقول المسماة الأقواس المتعرجة:

({int x, int y}) createPoint(int x, int y) {
  return (x: x, y: y);
}

تدعم السجلات تلقائياً المساواة بناءً على قيمها.

جرّب بنفسك

import 'geometry.dart';

void main() {
  // TODO: createPoint باستخدام (2, 4) عند A أنشئ النقطة
  
  // TODO: createPoint باستخدام (10, 8) عند B أنشئ النقطة
  
  // TODO: Point A: ([x], [y]) :باستخدام الحقول المسماة A اطبع النقطة
  
  // TODO: Point B: ([x], [y]) :باستخدام الحقول المسماة B اطبع النقطة
  
  // TODO: Midpoint: ([x], [y]) :احسب نقطة المنتصف واطبع
  
  // TODO: dy و dx احسب المسافة واستخدم التفكيك لاستخراجها إلى
  // Distance: dx=[dx], dy=[dy] :ثم اطبع
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming