Dart / الأساسيات: القيم والغياب والمجموعات والكائنات الصالحة / الدرس 3
معالجة الغياب دون إخفاء المدخل غير الصالح
استخدم الأنواع القابلة للخلو وترقية النوع والعمليات الواعية بالخلو وtryParse، مع توضيح التهيئة المتأخرة والتوكيدات.
في هذه الصفحة
أهداف الدرس
- ميّز null والنص الفارغ وفشل التحليل وخرق قاعدة المجال.
- اشرح وعد ? و! و?? وlate عند الحدود الخاصة بكل منها.
ضع اختيارية القيمة في نوعها
يستبعد String القيمة null في نظام أمان الخلو السليم، بينما يسمح String? بنص أو بغيابه. يظل النص الفارغ نصا موجودا طوله صفر. حدّد المعنى الذي يحتاجه المجال قبل اختيار بديل. قد يكون غياب ملاحظة اختيارية عاديا، لكن غياب معرف دفعة مطلوب قد يمثل إخفاق تكامل. يساعد أمان الخلو المحلل على رفض عمليات غير آمنة كثيرة، لكنه لا يتحقق من مطابقة القيمة الموجودة لصيغة العمل، وقد تظل التوكيدات الصريحة أو التهيئة المؤخرة تسبب إخفاقات تشغيل. أبق هذه الضمانات المختلفة ظاهرة.
يحفظ الوصول الواعي بالخلو احتمال الغياب
يصل العامل ?. إلى العضو فقط عندما لا يكون المستقبل null. يختار ?? الطرف الأيمن عندما يكون الأيسر null فقط، لا عندما يكون فارغا أو صفرا. أما ! فيؤكد وجود القيمة القابلة للخلو، وقد يفشل إذا لم يصح الوعد. لا تجعله طريقة عادية لإسكات التحليل عند حد المدخل الخارجي. يقارن المثال الغائب والفارغ باستخدام بديل آمن. مخرجه مستنتج من البيانات الثابتة، وليس محفوظا من تشغيل Dart.
void main() {
final String? missing = null;
final String? empty = '';
print(missing?.length ?? -1);
print(empty?.length ?? -1);
print(missing ?? 'no note');
}
-1
0
no note
المخرج المتوقع -1 ثم 0 ثم no note. ليس النص الفارغ null، فيُحتفظ بطوله الصفري. لم تُنفّذ بيئة تشغيل أو أداة تحليل.
دع تدفق التحكم يثبت نوعا محليا صالحا للاستخدام
بعد فحص مناسب، يستطيع تحليل التدفق ترقية القيمة إلى نوع أكثر تحديدا. تجعل عودة مبكرة عند null استخدام قيمة محلية مستقرة لاحقا واضحا. تعتمد الترقية على قواعد اللغة وإمكان تغير القيمة؛ فلا تعامل كل خاصية أو متغير معدل ملتقط كما لو كان محليا لا يتغير. استخدم لقطة محلية مقصودة عندما تكون هي المعنى المطلوب، بدلا من إدخال ! في كل موضع. واللقطة نفسها اختيار دلالي؛ فإذا احتاج العمل الخاصية الحية الحالية فقد تغيّر قراءتها مرة واحدة معنى السياسة.
لا يثبت نجاح التحليل صحة المجال
تعيد int.tryParse عددا صحيحا أو null بدلا من الرمي عند فشل تحليل عادي. قد يظل عدد سالب محلل غير صالح لعدد عينات. يفحص المساعد قاعدة الإيجابية بعد التحويل ويعيد null لسببي الرفض. يصلح ذلك فقط إذا لم يحتج المستدعي أسبابا مفصلة. ويمكن لنتيجة منمطة لاحقا التمييز بين النص المشوه والقيمة غير المقبولة. حذف المسافات سياسة إدخال صريحة لا تصحيح عام؛ فلا تطبق التطبيع نفسه عمياء على المعرفات أو البيانات البروتوكولية الموقعة.
int? positiveCount(String text) {
final value = int.tryParse(text.trim());
if (value == null || value <= 0) return null;
return value;
}
void main() {
for (final text in <String>[' 3 ', 'bad', '0']) {
print(positiveCount(text) ?? 'invalid');
}
}
3
invalid
invalid
المخرج المتوقع 3 ثم invalid ثم invalid. الصفر صالح نحويا لكنه مرفوض بقاعدة الإيجابية. جميع النصوص مدخلات اصطناعية ثابتة ولم يُنفّذ البرنامج.
تنقل late التزام التهيئة إلى وقت التشغيل
تدعم late قيمة تُهيأ بعد التصريح، وقد يؤجل مهيئ late العمل حتى أول استخدام. لكنها لا تثبت أن كل مسار حياة يهيئ القيمة قبل قراءتها. قد تفشل قراءة late غير مهيأة أثناء التشغيل. ولربط late final التزام بالإسناد مرة واحدة أيضا. فضّل حالة مطلوبة في المنشئ عندما لا يكون للكائن معنى دونها. وعندما تبرر التأخير، سمّ مالك التهيئة وموعدها واختبر القراءة المبكرة، ولا تعرض كائنا نصف جاهز كأن حقوله غير الخالية أصبحت جاهزة بالفعل.
الأخطاء الشائعة وإصلاحها
يفشل ! عند حقل غائب بصورة اعتيادية.
- لماذا يحدث؟
- عومل الغياب المتوقع كحالة داخلية مستحيلة.
- كيف تصلحه؟
- عالج الغياب صراحة بالرفض أو البديل أو نتيجة اختيارية.
- كيف تتجنب تكراره؟
- اطلب قيدا حقيقيا قبل إضافة توكيد عدم الخلو.
تُعد ملاحظة فارغة ملاحظة غائبة.
- لماذا يحدث؟
- دمج التطبيق معنيين مختلفين دون سياسة معلنة.
- كيف تصلحه؟
- افحص الفراغ بصورة منفصلة إذا احتاج المجال التمييز.
- كيف تتجنب تكراره؟
- أدرج null والفراغ والمسافات والقيمة العادية في أمثلة الحدود.
تُقرأ خاصية late قبل اكتمال الإعداد.
- لماذا يحدث؟
- كانت ملكية التهيئة أو ترتيب العمر ضمنيين.
- كيف تصلحه؟
- اطلب البيانات عند البناء أو افرض بروتوكول تهيئة مؤخرة صريحا.
- كيف تتجنب تكراره؟
- اختبر كل مسار قد يكشف الكائن قبل جاهزيته.
اختبر فهمك
1. لماذا يفقد value?.length ?? 0 معلومة إذا ميّز التقرير بين النص الغائب والفارغ؟
اعرض الحل المشروح
تصبح الحالتان صفرا، فلا يستعيد التقرير أي مدخل حدث. احفظ طولا قابلا للخلو أو حالة صريحة حتى تقرر طبقة العرض إظهار كل حالة. لا يصح البديل إلا إذا كان دمج المعنيين مقصودا. لا تثبت الصياغة الآمنة وحدها مطابقة فقد هذا التمييز لمطلب المنتج.
2. هل يعد late String id بأن للكائن معرفا صالحا دائما؟
اعرض الحل المشروح
لا. تؤجل late مسؤولية التهيئة إلى التشغيل ولا تتحقق من محتوى المعرف. قد تفشل القراءة قبل الإسناد، وقد يخالف نص فارغ مسند قاعدة المجال. فضّل بيانات منشئ مطلوبة حيث يمكن، ثم تحقق من الصيغة والملكية عند الحد المناسب. لا يغني تأخير الإسناد عن أي من الفحصين.
أهم ما تعلمته
- تحفظ العمليات الواعية بالخلو الأمان ضمن معناها المحدد فقط.
- يتطلب الوجود وصحة المحتوى وجاهزية العمر تحليلات منفصلة.