محتويات الدورة
Dart
الأساسيات: القيم والغياب والمجموعات والكائنات الصالحة
العقود: الأنماط والواجهات العامة والنتائج غير المتزامنة
التكامل: الأهداف والموارد والتحقق والأدلة

Dart / التكامل: الأهداف والموارد والتحقق والأدلة / الدرس 18

مراجعة مسار دفعات محلي منمط

اجمع التحليل والنتائج المغلقة وملخصات السجلات وحدود الثبات وملكية Future دون ادعاء خدمة إنتاجية.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • احفظ نتيجة مفهومة لكل مدخل معطى قبل التجميع.
  • افصل دليل السياسة المحلية عن مطالب المنصة والدوام والتفويض والاستعادة.

اكتب الوعد الصغير الذي ينفذه المشروع فعلا

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

احفظ سبب رفض المدخل

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

dart نتيجة صريحة لكل مدخل نصي
sealed class CountResult {}
final class ValidCount extends CountResult {
  final int value;
  ValidCount(this.value);
}
final class InvalidCount extends CountResult {
  final String reason;
  InvalidCount(this.reason);
}
CountResult parseCount(String text) {
  final value = int.tryParse(text.trim());
  if (value == null) return InvalidCount('not-an-int');
  if (value < 1 || value > 1000) return InvalidCount('out-of-range');
  return ValidCount(value);
}
String label(CountResult result) => switch (result) {
  ValidCount(value: final value) => 'valid:$value',
  InvalidCount(reason: final reason) => 'invalid:$reason',
};
void main() {
  for (final input in <String>[' 2 ', 'bad', '0']) {
    print(label(parseCount(input)));
  }
}
الناتج المتوقع
valid:2
invalid:not-an-int
invalid:out-of-range

المخرج المتوقع valid:2 ثم invalid:not-an-int ثم invalid:out-of-range. لم يُشغّل محلل أو بيئة Dart، ولا تُنشأ دفعة حقيقية.

اجمع بعد اختيار سياسة القبول

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

انتظر النتيجة المعلنة دون اختلاق دوام خلفي

يجري الغلاف async أدناه عملا محليا ويعيد سجله عبر Future. يوضح انتظار المستدعي قبل الطباعة، ولا ينقل الحلقة لعازل آخر أو يحفظ مهمة خلفية. إذا أضيفت I/O حقيقية فضعها خلف حد مملوك بسياسة خطأ وإلغاء، ولا تعكس مهلة Future وحدها العملية. أبق التحليل والملخص قابلين للفحص بثوابت، حتى لا يسمى فشل المنصة عددا مشوها.

dart ملخص سجل مسمى يُنتظر اكتماله
import 'dart:async';
Future<({int accepted, int rejected, int total})> summarize(List<String> inputs) async {
  var accepted = 0;
  var rejected = 0;
  var total = 0;
  for (final text in inputs) {
    final count = int.tryParse(text.trim());
    if (count == null || count < 1 || count > 1000) {
      rejected += 1;
    } else {
      accepted += 1;
      total += count;
    }
  }
  return (accepted: accepted, rejected: rejected, total: total);
}
Future<void> main() async {
  final result = await summarize(<String>['2', 'bad', '0', '3']);
  print('accepted=${result.accepted}');
  print('rejected=${result.rejected}');
  print('total=${result.total}');
}
الناتج المتوقع
accepted=2
rejected=2
total=5

المخرج المتوقع accepted=2 ثم rejected=2 ثم total=5. تمثل Future إتماما محليا فقط. لم يُترجم المصدر أو ينفذ أو يقاس أو يربط بخدمة.

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

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

الأخطاء الشائعة وإصلاحها

تختفي المدخلات الخاطئة ويُسمى الملخص نجاحا كاملا.

لماذا يحدث؟
أُدخل القبول الجزئي دون عقد منتج.
كيف تصلحه؟
احفظ نتائج الرفض أو أعلن القبول الجزئي صراحة.
كيف تتجنب تكراره؟
حدّد الاكتمال قبل الترشيح أو التجميع.

يُفترض أن ملخص async يعمل على عامل حساب آخر.

لماذا يحدث؟
اختلط إتمام Future بتنفيذ عازل.
كيف تصلحه؟
أظهر النموذج المحلي ولا تضف عازلا إلا لهدف مدعوم وحاجة مبررة.
كيف تتجنب تكراره؟
افصل فرضيات الأداء عن أمثلة صياغة اللغة.

يُعرض المشروع كخدمة دفعات إنتاجية دائمة.

لماذا يحدث؟
أُهملت حدود الدوام والمرجعية والاستعادة الغائبة.
كيف تصلحه؟
اذكر النطاق المحلي واطلب دليلا منفصلا لتنفيذ الآثار الحقيقية.
كيف تتجنب تكراره؟
اربط كل ادعاء جاهزية باختبارات منفذة في بيئتها المعلنة.

اختبر فهمك

1. ما الذي يتغير إذا احتاج المستدعي السبب الدقيق لكل عدد مرفوض؟

اعرض الحل المشروح

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

2. اذكر ثلاثة حدود أدلة مستقلة قبل تحويل المشروع لخدمة حقيقية.

اعرض الحل المشروح

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

أهم ما تعلمته

  • تفيد المراحل المحلية المنمطة عندما تبقى ضماناتها وحدودها صريحة.
  • يجب أن يميز التقرير تحليل المصدر والفحوص المنفذة والتزامات الخدمة غير المختبرة.

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