Menu
CoddyTech

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 halted

helper 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 USD

Kode 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(...))
challenge icon

Tantangan

Mudah

new_score(points, max) membuat object score di Score.R. Lengkapi fungsi lainnya di file yang sama:

  • validate_score(x) berhenti dengan pesan points must not be negative, max must be positive atau points must not exceed max, diperiksa dalam urutan tersebut, dan jika tidak, mengembalikan x.
  • score(points, max = 100) mengonversi kedua argumen dengan as.double() dan mengembalikan validate_score(new_score(...)).
  • format.score(x, ...) mengembalikan 45/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 = "")
}
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