Dart / دليل حلول تحريري

تشخيص العمل الكسول المكرر واللقطات المتغيرة

ميّز تقييم Iterable المؤجل وتكرار المرور والحاويات المشتركة والعناصر الداخلية المعدلة، قبل إضافة نسخ أو تخزين مؤقت بلا تشخيص.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

يزيد عرض معاينة افتراضي عداد المعالجة مرتين رغم ثبات المصدر. وتخزن شاشة أخرى قائمة final غير قابلة للتعديل لكنها ترى تسمية عنصر تتغير. يوصفان بسلوك قائمة مفاجئ، لكن الأول قد يكون حسابا متكررا والثاني حالة عناصر مشتركة. يجب أن يحفظ الإصلاح عقد اللقطة والأثر المقصودين.

افهم الأسباب المحتملة

  • تنتج map وwhere المعتادتان Iterable كسولة قد تنفذ نداءاتها في كل مرور. قد تحمل final وصف الحساب لا نتائجه. ومن جهة أخرى يحتفظ نسخ القائمة الخارجية أو حمايتها بمراجع العناصر. لذلك تهم المراجع المعدلة وقواعد المساواة حتى عندما لا يستطيع أحد إضافة عناصر اللقطة أو حذفها.

عد مرات المرور قبل إلقاء اللوم على المصدر

حدّد كل مستهلك لـIterable الناتجة: العرض والعد والسجلات والتصدير وtoList لاحقة قد يطلب كل منها عملا. لا تفترض حفظ التحويل نتائجه. استخدم مثالا اصطناعيا صغيرا بعداد أو سجل أحداث لإظهار التوقيت، ثم أزل الأثر التشخيصي من التحويل النهائي حيث يمكن. يمر المصدر الكامل التالي على المنظور مرتين عمدا. مخرجه متوقع بالتحليل فقط لغياب مترجم Dart وبيئتها.

dart مثال مرور كسول متكرر
void main() {
  var calls = 0;
  final transformed = <int>[1, 2].map((value) {
    calls += 1;
    return value * 10;
  });
  print(transformed.toList());
  print(transformed.toList());
  print('calls=$calls');
}
الناتج المتوقع
[10, 20]
[10, 20]
calls=4

المخرج المتوقع [10, 20] ثم [10, 20] ثم calls=4. يستدعي كل مرور التحويل للعنصرين. العداد أداة شرح تشخيصية لا أثر معالجة موصى به.

اختر تخزين النتائج عندما يكون ذلك العقد المقصود

يمكن أن توفر toList نتيجة مقيمة واحدة لإعادة الاستخدام، لكنها تغير الحداثة والذاكرة. قد يخطئ التخزين إذا احتاج المستدعي منظورا حيا. وإذا وجب تنفيذ فعل مرة فضعه في مرحلة أثر مملوكة، ولا تعتمد على ألا يكرر أحد المرور. حدّد رفض العناصر الخاطئة أو ترشيحها، ورؤية التعديل عند القراءة اللاحقة. تحتاج اللقطة وقت إنشاء ومالكا، ولا يمنح final لمتغير كسول القرارين.

افحص كائنات العناصر إلى جانب الحاوية

إذا تغير مظهر قائمة غير قابلة للتعديل فافحص هل تغيرت البنية أم كائن عنصر عبر مرجع آخر. يثبت المثال الحاوية ويغير كائنا داخلها. يسمح النموذج بذلك ولا يعني فشل منشئ القائمة. استخدم عناصر قيمية ثابتة أو نسخا أعمق صريحا عند اشتراط ثبات الداخل. حدّد الهوية وكائنات الموارد؛ فقد يكسر النسخ العميق غير المميز مشاركة مشروعة أو يكرر موردا خطأ.

dart حاوية غير قابلة للتعديل بعنصر قابل للتغيير
class Label {
  String text;
  Label(this.text);
}
void main() {
  final item = Label('raw');
  final snapshot = List<Label>.unmodifiable(<Label>[item]);
  item.text = 'changed';
  print(snapshot.single.text);
}
الناتج المتوقع
changed

المخرج المتوقع changed. يبقى مرجع العنصر مشتركا رغم منع تعديل القائمة الخارجية. المصدر توضيحي غير منفذ.

تحقق من الحداثة والعزل وعدد الآثار منفصلة

في مشروع معزول متوافق، كرر المرور وعدّل المصدر بعد اللقطة والعناصر المسموح تعديلها. افحص وعد العقد لكل حالة. وإذا استُخدمت كائنات ذات مساواة مخصصة كمفاتيح فتأكد من ثبات حالتها المعنية أثناء التخزين. افحص الحجم قبل تجسيد مدخل كبير. لا تستنتج تحسن الأداء من قلة النداءات وحدها؛ فللتنفيذ والذاكرة والحداثة أدلة مستقلة. لا يسجل الدليل قياسا أو نجاح محلل أو اختبار تعديل منفذا.

تحقق من نجاح الإصلاح

يجب أن يظهر التصميم المصحح العدد المقصود للآثار وعلاقة المصدر باللقطة الموعودة. احتفظ بالمثال الأصلي وسجّل نتائج الأدوات الفعلية عند التنفيذ. ميّز إصلاح تكرار التقييم من إصلاح مشاركة العناصر المعدلة؛ فلا يحل أحدهما الآخر تلقائيا.

امنع تكرار المشكلة

  • وثّق النتائج الكسولة والمجسدة وأبعد الآثار عن التحويلات القابلة لإعادة الاستخدام وحدّد ملكية الحاوية والعناصر. راجع دلالات اللقطة عند إضافة تخزين مؤقت أو تغليف مانع للتعديل أو حقول معدلة أو مستهلك آخر لـIterable نفسها.

المراجع الرسمية