Validator dan helper
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 5 dari 57.
Konstruktor memeriksa tipe data, sedangkan validator memeriksa nilai. Sesuai konvensi, validate_money() menerima object, memanggil stop() dengan pesan yang jelas untuk setiap aturan yang dilanggar, lalu mengembalikan object jika semuanya sesuai. call. = FALSE membuat pemanggilan fungsi tidak disertakan dalam pesan:
new_money <- function(amount = double(), currency = character()) {
stopifnot(is.double(amount), is.character(currency))
structure(list(amount = amount, currency = currency), class = "money")
}
validate_money <- function(x) {
if (x$amount < 0) stop("amount must not be negative", call. = FALSE)
if (nchar(x$currency) != 3) stop("currency must have 3 letters", call. = FALSE)
x
}
m <- validate_money(new_money(-5, "EUR"))Output:
Error: amount must not be negative
Execution haltedhelper adalah fungsi yang dipanggil oleh kode lain. Namanya mengikuti nama class, mengonversi inputnya ke tipe yang tepat, mengisi nilai default, lalu meneruskan hasilnya melalui constructor dan validator:
new_money <- function(amount = double(), currency = character()) {
stopifnot(is.double(amount), is.character(currency))
structure(list(amount = amount, currency = currency), class = "money")
}
validate_money <- function(x) {
if (x$amount < 0) stop("amount must not be negative", call. = FALSE)
x
}
money <- function(amount, currency = "EUR") {
validate_money(new_money(as.double(amount), toupper(currency)))
}
m <- money("12", "usd")
cat(m$amount, m$currency)Output:
12 USDKode yang membaca input pengguna menangkap error dari validator dengan tryCatch() dan menampilkan conditionMessage(e), yaitu teks yang diteruskan ke stop():
validate_age <- function(x) {
if (x$years < 0) stop("age must not be negative", call. = FALSE)
if (x$years > 150) stop("age is too large", call. = FALSE)
x
}
age <- function(years) validate_age(structure(list(years = as.double(years)), class = "age"))
for (input in c("30", "-2", "200")) {
result <- tryCatch(paste("ok", age(input)$years), error = function(e) conditionMessage(e))
cat(result, "\n")
}Output:
ok 30
age must not be negative
age is too large Masing-masing dari ketiga fungsi memiliki satu tugas. new_money() ketat dan cepat, untuk kode yang tipenya sudah benar. validate_money() berisi aturan tentang nilai, yang bisa lambat atau banyak. money() mudah digunakan dan dipakai oleh bagian program lainnya:
new_money() # hanya tipe data; membuat object dengan structure()
validate_money() # aturan nilai; jalankan stop() dengan pesan, jika tidak, kembalikan x
money() # mengonversi input, lalu menjalankan validate_money(new_money(...))Tantangan
Mudahnew_score(points, max) membuat object score di Score.R. Lengkapi fungsi lainnya di file yang sama:
validate_score(x)berhenti dengan pesanpoints must not be negative,max must be positiveataupoints must not exceed max, diperiksa dalam urutan tersebut, dan jika tidak, mengembalikanx.score(points, max = 100)mengonversi kedua argumen denganas.double()dan mengembalikanvalidate_score(new_score(...)).format.score(x, ...)mengembalikan45/50 (90%), dengan persentase dibulatkan ke bilangan bulat.
Gunakan call. = FALSE di setiap stop(). Kode yang disediakan membaca baris 45 50, mencetak skor yang telah diformat, atau error: dan pesannya.
Tulis kodemu di Score.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
source("Score.R")
# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
s <- tryCatch(score(p[1], p[2]), error = function(e) conditionMessage(e))
if (is.character(s)) cat("error: ", s, "\n", sep = "") else cat(format(s), "\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