تكرار السؤال: …
الإجابة المختصرة
الـ Record نوع مجمّع غير قابل للتغيير يجمع عدة قيم دون تعريف class (مثل (String, int))، والـ Patterns تطابق شكل القيمة وتفككها في تصريح واحد داخل switch أو if-case أو التصريحات.
الشرح
تُقارن الـ Records بالقيمة (==) وتدعم حقولًا موضعية وأخرى مسماة، فتناسب إرجاع أكثر من قيمة من دالة دون إنشاء class مخصص. أما الـ Patterns فتتيح تفكيك Record أو قائمة أو Map أو كائن، وفحص النوع والقيمة معًا في خطوة واحدة (مثل if (json case {'name': String name}))، كما تُستخدم في switch expressions التي يتحقق المترجم من شمولها. استخدم class عندما يكون للبيانات هوية أو سلوك أو قواعد تحقق، واترك Record للتجميع المؤقت لقيم صغيرة.
مثال بالكود
(String name, int age) parseUser(Map<String, Object?> json) {
if (json case {'name': String name, 'age': int age}) {
return (name, age);
}
throw const FormatException('Invalid user');
}
void main() {
final (name, age) = parseUser({'name': 'Mona', 'age': 31});
print('$name is $age');
final point = (x: 1, y: 0); // record with named fields
print(switch (point) {
(x: 0, y: 0) => 'origin',
(x: var x, y: 0) => 'on the x axis at $x',
_ => 'somewhere else',
});
}أخطاء شائعة
- استخدام Record لتمثيل كيان له دلالة وسلوك (مثل User) بدل class، فتضعف القراءة وقابلية التطوير.
- نسيان أن الـ Records تقارن بالقيمة لا بالمرجع، فيُفترض خطأً أن كائنين متطابقين الحقول مختلفان.