فحوصات الصلاحية
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 24 من 57.
يتحقق R من الأنواع؛ أما القواعد المتعلقة بالقيم فهي من مسؤوليتك. الوسيط validity في setClass() هو دالة للكائن object تُرجع TRUE عندما يكون الكائن سليمًا، أو سلسلة محارف تصف المشكلة. تنفّذها new() لكل كائن:
setClass("Account", slots = c(owner = "character", balance = "numeric"),
validity = function(object) {
if (object@balance < 0) return("balance must not be negative")
TRUE
})
ok <- new("Account", owner = "Ada", balance = 10)
msg <- tryCatch(new("Account", owner = "Bo", balance = -5), error = function(e) conditionMessage(e))
cat(msg)الناتج:
invalid class “Account” object: balance must not be negativeيمكن لدالة التحقق الإبلاغ عن عدة مشكلات في آنٍ واحد من خلال إرجاع متجه محارف. يقوم R بترقيمها في رسالة الخطأ:
setClass("Range", slots = c(lo = "numeric", hi = "numeric"),
validity = function(object) {
problems <- character(0)
if (length(object@lo) != 1) problems <- c(problems, "lo must be one number")
if (length(object@hi) != 1) problems <- c(problems, "hi must be one number")
if (length(problems) == 0) TRUE else problems
})
msg <- tryCatch(new("Range", lo = c(1, 2), hi = numeric(0)), error = function(e) conditionMessage(e))
cat(msg)الناتج:
invalid class “Range” object: 1: lo must be one number
invalid class “Range” object: 2: hi must be one number@<- يتحقق من النوع لكنه لا يشغّل دالة التحقق من الصلاحية، لذا يمكن أن يؤدي التعيين إلى خرق قاعدة. يعيد validObject() إجراء التحقق؛ استدعِه بعد تغيير الفتحات:
setClass("Account", slots = c(balance = "numeric"),
validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
a <- new("Account", balance = 10)
a@balance <- -99
cat("still created:", a@balance, "\n")
msg <- tryCatch(validObject(a), error = function(e) conditionMessage(e))
cat(msg, "\n")المخرجات:
still created: -99
invalid class “Account” object: balance must not be negative يضع R العبارة invalid class “Account” object: قبل نصك. يمكن للكود الذي يعرض الرسالة للمستخدم الاحتفاظ بالجزء الذي يلي object: فقط:
setClass("Account", slots = c(balance = "numeric"),
validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
msg <- tryCatch(new("Account", balance = -1), error = function(e) conditionMessage(e))
cat(sub(".*object: ", "", msg))الناتج:
balance must not be negativeالتحدي
سهلأعلن عن الصنف Rating في Rating.R باستخدام الفتحتين stars (numeric) وcomment (character)، ودالة صلاحية تُرجع أول قاعدة منتهكة:
stars must be a whole number from 1 to 5عندما لا تكون قيمة النجوم واحدة من 1 أو 2 أو 3 أو 4 أو 5؛comment is too longعندما يحتوي التعليق على أكثر من 20 حرفًا.
وإلا فإنها تُرجع TRUE. يقرأ الكود المتوفر السطر 4;Great (وقد يكون التعليق مفقودًا)، وينشئ كل تقييم ويطبع ok: 4/5 أو نص المشكلة.
ضع الكود الخاص بك في Rating.R. يحتوي main.R على كود الإدخال/الإخراج المتوفر ولا يمكن تعديله.
جرّب بنفسك
source("Rating.R")
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
out <- tryCatch({
r <- new("Rating", stars = as.numeric(p[1]), comment = if (length(p) > 1) p[2] else "")
paste0("ok: ", r@stars, "/5")
}, error = function(e) sub(".*object: ", "", conditionMessage(e)))
cat(out, "\n", sep = "")
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت