دوال الوصول
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 19 من 57.
التغليف يعني أن التعليمات البرمجية الأخرى تتعامل مع كائن من خلال الدوال بدلًا من الوصول مباشرةً إلى حقوله. يقرأ المُسترجِع قيمةً، بينما يغيّر المُعيِّن قيمتها. بالنسبة إلى قائمة S3، يُرجع المُعيِّن النسخة التي تم تغييرها:
new_member <- function(name) structure(list(name = name), class = "member")
get_name <- function(p) p$name
set_name <- function(p, value) {
p$name <- value
p
}
p <- new_member("ada")
p <- set_name(p, "Ada Lovelace")
print(get_name(p))الناتج:
[1] "Ada Lovelace"تتيح أدوات الوصول للكائن تغيير طريقة تخزينه للبيانات دون كسر الشيفرة التي تستخدمه. يخزّن مقياس الحرارة هذا درجات الحرارة بالسلسيوس، وتحسب دالة getter درجات فهرنهايت عند طلبها، لذلك لا يرى المستدعون الحقل نفسه:
new_thermo <- function(c) structure(list(c = c), class = "thermo")
celsius <- function(t) t$c
fahrenheit <- function(t) t$c * 9 / 5 + 32
t <- new_thermo(25)
cat(celsius(t), fahrenheit(t))الناتج:
25 77تُعدّ أدوات الإسناد الخاصة بـ R، مثل names(x) <- ...، دوال استبدال. تتيح دالة تُسمّى "name<-" وتكون وسيطاتها x وvalue للمتصلين كتابة name(p) <- "Bo"؛ إذ تستدعيها R وتُسنِد النتيجة مرة أخرى إلى p:
new_member <- function(name) structure(list(name = name), class = "member")
name <- function(p) p$name
"name<-" <- function(x, value) {
x$name <- trimws(value)
x
}
p <- new_member("ada")
name(p) <- " Bo "
print(name(p))الناتج:
[1] "Bo"يعيد getter لكائن الإغلاق نسخةً من البيانات الخاصة. لا يؤدي تغيير هذه النسخة إلى تغيير الكائن، لذا فإن الطريقة الوحيدة للوصول إليه هي من خلال دوال الكائن نفسه:
make_list <- function() {
items <- character(0)
list(add = function(x) items <<- c(items, x),
get_items = function() items)
}
todo <- make_list()
todo$add("milk")
mine <- todo$get_items()
mine[1] <- "HACKED"
print(todo$get_items())الناتج:
[1] "milk"التحدي
سهلجهة الاتصال هي قائمة S3 من الفئة contact تحتوي على الحقلين name وemail. أكمل Contact.R:
- تخزّن
new_contact(name, email)البريد الإلكتروني بعد إزالة المسافات وتحويله إلى أحرف صغيرة. - دالتا الحصول
contact_name(x)وcontact_email(x). - دالة الاستبدال
"contact_email<-"، التي تخزّن البريد الإلكتروني الجديد بعد إزالة المسافات وتحويله إلى أحرف صغيرة، بحيث يمكن للمتصلين كتابةcontact_email(c1) <- value.
يقرأ الكود المزوّد name,email، ثم عناوين البريد الإلكتروني الجديدة، ويطبع Ada <ada@x.com> بعد كل تغيير وأسماء الحقول المخزّنة في النهاية.
ضع الكود الخاص بك في Contact.R. يحتوي main.R على كود الإدخال/الإخراج المزوّد ولا يمكن تعديله.
جرّب بنفسك
source("Contact.R")
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ",")[[1]]
c1 <- new_contact(p[1], p[2])
cat(contact_name(c1), " <", contact_email(c1), ">\n", sep = "")
for (value in input[-1]) {
contact_email(c1) <- value
cat(contact_name(c1), " <", contact_email(c1), ">\n", sep = "")
}
cat("stored fields: ", paste(names(unclass(c1)), collapse = ", "), "\n", sep = "")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت