Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

دوال الوصول

جزء من قسم البرمجة كائنية التوجه في رحلة 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"
challenge icon

التحدي

سهل

جهة الاتصال هي قائمة 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 = "")
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم R عبر الإنترنت