Menu
CoddyTech

Fungsi accessor

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 19 dari 57.

Enkapsulasi berarti kode lain berinteraksi dengan object melalui fungsi, bukan dengan mengakses langsung field-nya. Getter membaca nilai, sedangkan setter mengubahnya. Untuk list S3, setter mengembalikan salinan yang sudah diubah:

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))

Output:

[1] "Ada Lovelace"

Accessor memungkinkan object mengubah cara menyimpan data tanpa merusak kode yang menggunakannya. Termometer ini menyimpan Celsius, dan getter menghitung Fahrenheit saat diminta, sehingga pemanggil tidak pernah melihat field itu sendiri:

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))

Output:

25 77

Setter bawaan R, seperti names(x) <- ..., adalah fungsi pengganti. Fungsi bernama "name<-" dengan parameter x dan value memungkinkan pemanggil menulis name(p) <- "Bo"; R memanggilnya dan menetapkan hasilnya kembali ke 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))

Output:

[1] "Bo"

Getter dari object closure mengembalikan salinan data privat. Mengubah salinan itu tidak mengubah object, jadi satu-satunya cara untuk mengaksesnya adalah melalui fungsi milik object itu sendiri:

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())

Output:

[1] "milk"
challenge icon

Tantangan

Mudah

Kontak adalah list S3 dari class contact dengan field name dan email. Lengkapi Contact.R:

  • new_contact(name, email) menyimpan email setelah spasi di awal dan akhir dihapus, serta dalam huruf kecil.
  • Getter contact_name(x) dan contact_email(x).
  • Fungsi pengganti "contact_email<-", yang menyimpan email baru setelah spasi di awal dan akhir dihapus, serta dalam huruf kecil, sehingga pemanggil dapat menulis contact_email(c1) <- value.

Kode yang disediakan membaca name,email, lalu email baru, dan mencetak Ada <ada@x.com> setelah setiap perubahan serta nama field yang tersimpan pada akhirnya.

Tempatkan kodemu di Contact.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

source("Contact.R")

# Kode input/output yang disediakan: biarkan apa adanya
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler R online