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 77Setter 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"Tantangan
MudahKontak 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)dancontact_email(x). - Fungsi pengganti
"contact_email<-", yang menyimpan email baru setelah spasi di awal dan akhir dihapus, serta dalam huruf kecil, sehingga pemanggil dapat menuliscontact_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 = "")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar S3
Bekerja dengan fileList dengan classFungsi KonstruktorMethod print dan formatValidator dan helperUlasan: Suhu4Enkapsulasi di R
Closure sebagai objectEnvironment sebagai objectFungsi accessorMelindungi stateRangkuman: Meter Parkir2S3 Generics dan Method
Generics dan UseMethodMethod DefaultMethod untuk Base GenericsDasar-Dasar NextMethodRekap: Luas Bangun5S4 class
Mendefinisikan class S4Slots dan AksesPemeriksaan ValiditasMethod showRingkasan: Katalog Produk8Kelas Referensi
Mendefinisikan Kelas ReferensiPembaruan method dan fieldSemantik PenyalinanPewarisan dan callSuperRangkuman: Antrean Tugas11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam BukuLatihan sendiri: Compiler R online