محتويات الدورة

برمجة R / التقييم والملكية والنتائج القابلة للإعادة / الدرس 15

الشروط والتنظيف واختبارات العقود

احفظ الفشل ذا المعنى واسترجع الحالة المملوكة عند الخروج المعتاد من الدالة.

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

أهداف الدرس

  • تمييز الرسالة والتحذير والخطأ.
  • التقاط شرط معلوم دون إخفاء عيب آخر.
  • تسجيل التنظيف واختبار حدود النجاح والفشل.

يحمل الشرط معلومات عن الحدث

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

التقط الفشل الذي يفهمه المستدعي فقط

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

r برنامج توضيحي بلغة R الأساسية؛ لم تتوفر بيئة R أثناء المراجعة
divide <- function(a, b) {
  if (b == 0) stop(errorCondition("zero denominator", class = "zero_denominator"))
  a/b
}
safe_divide <- function(a, b) {
  tryCatch(list(ok = TRUE, value = divide(a, b)),
           zero_denominator = function(e) list(ok = FALSE, reason = conditionMessage(e)))
}
good <- safe_divide(6, 2)
bad <- safe_divide(6, 0)
cat("good=", good$ok, "; value=", good$value, "\n", sep = "")
cat("bad=", bad$ok, "; reason=", bad$reason, "\n", sep = "")
الناتج المتوقع
good=TRUE; value=3
bad=FALSE; reason=zero denominator

يتيح الصنف الضيق فشلاً متوقعاً صريحاً دون تحويل عيوب البرمجة الأخرى إلى أعداد معقولة.

ضع التنظيف قرب اكتساب المورد

تحدد الدالة التي تغير خياراً أو تفتح اتصالاً أو جهاز رسم ملكيتها وطريقة الاسترجاع. تسجل on.exit تعبيراً للخروج المعتاد أو انتشار الخطأ. يستعمل المثال علامة داخل الذاكرة بدلاً من مورد خارجي. سجل التنظيف فور اكتساب المورد، واستخدم add=TRUE للإضافة بدلاً من استبدال تنظيف سابق. يهم الترتيب عند اعتماد الموارد على بعضها. لا يشمل ضمان الخروج المعتاد انهيار العملية أو إنهاءها قسراً.

r برنامج توضيحي بلغة R الأساسية؛ لم تتوفر بيئة R أثناء المراجعة
resource <- new.env(parent = emptyenv())
resource$closed <- FALSE
work <- function() {
  on.exit({ resource$closed <- TRUE }, add = TRUE)
  stop("synthetic failure")
}
message <- tryCatch(work(), error = function(e) conditionMessage(e))
cat("message=", message, "\n", sep = "")
cat("cleanup=", resource$closed, "\n", sep = "")
الناتج المتوقع
message=synthetic failure
cleanup=TRUE

المورد علامة داخل الذاكرة؛ ويتوقع التنظيف عند انتشار خطأ عادي دون فتح ملف أو جهاز أو خدمة.

للمعالج والتنظيف مسؤوليتان مختلفتان

يختار tryCatch نتيجة بديلة عند انتقال التحكم إلى معالج مطابق. تفحص calling handlers الشروط بأسلوب تحكم مختلف وتضيف restarts آليات استرداد أخرى. استخدمها وفق واجهة معرفة لا لإخفاء تحقق بسيط. يجب أن يسترجع التنظيف الحالة المملوكة سواء قبل المستدعي الخطأ أم نشره. قد يعقد فشل التنظيف التشخيص؛ فاحفظ السياق الأصلي عند الإمكان واجعل العمليات ضيقة. لا تغير خيارات التحذير العامة بصمت لإظهار برنامج نظيف.

اختبر العقود لا الحساب الناجح وحده

يمكن لاختبار أساسي استخدام stopifnot ومقارنات القيم والأنواع والأبعاد والأسماء والشروط. تحتاج النتائج التقريبية سماحية معلنة. اختبر النجاح والنوع أو الطول الخاطئ والفراغ والفقد ومسار فشل المورد، وتحقق من عدم ابتلاع خطأ غير متعلق. يثبت نجاح اختبار حالة محددة لا صحة شاملة. لم تتوفر R أثناء المراجعة، فالنصوص ومسارات الشروط توقعات موثقة ولم ينفذ معالج أو تنظيف أو تحقق R.

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

أصبح كل ملخص فاشل صفراً

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

عطلت إضافة تنظيف خطوة سابقة

لماذا يحدث؟
استبدل تسجيل on.exit اللاحق السابق.
كيف تصلحه؟
حدد الإضافة والترتيب عمداً.
كيف تتجنب تكراره؟
اختبر موارد متعددة وانتشار فشل عادي.

اختفى التحذير وبقيت القيم الخاطئة

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

اختبر فهمك

1. لماذا لا يلتقط معالج شرط المقام الصفري خطأ متغير غير معرف؟

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

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

2. ماذا يفحص اختبار التنظيف بعد فشل اصطناعي؟

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

يفحص حفظ هوية الفشل واسترجاع الحالة المملوكة. في المثال تكون الرسالة synthetic failure والعلامة closed صحيحة. يحتاج الاتصال أو الجهاز الفعلي بيئة تنفيذ وفحوص ملكية خاصة.

أهم ما تعلمته

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

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