Menu
CoddyTech

Kiểm tra tính hợp lệ

Thuộc phần Lập trình hướng đối tượng trong hành trình R của Coddy. Bài học 24 trên 57.

R kiểm tra kiểu dữ liệu, còn quy tắc về giá trị là do bạn đặt ra. Đối số validity của setClass() là một hàm nhận object và trả về TRUE khi đối tượng hợp lệ, hoặc một chuỗi ký tự mô tả vấn đề. new() chạy hàm này cho từng đối tượng:

setClass("Account", slots = c(owner = "character", balance = "numeric"),
  validity = function(object) {
    if (object@balance < 0) return("balance must not be negative")
    TRUE
  })
ok <- new("Account", owner = "Ada", balance = 10)
msg <- tryCatch(new("Account", owner = "Bo", balance = -5), error = function(e) conditionMessage(e))
cat(msg)

Đầu ra:

invalid class “Account” object: balance must not be negative

Hàm kiểm tra tính hợp lệ có thể báo cáo nhiều vấn đề cùng lúc bằng cách trả về một vectơ ký tự. R đánh số chúng trong thông báo lỗi:

setClass("Range", slots = c(lo = "numeric", hi = "numeric"),
  validity = function(object) {
    problems <- character(0)
    if (length(object@lo) != 1) problems <- c(problems, "lo must be one number")
    if (length(object@hi) != 1) problems <- c(problems, "hi must be one number")
    if (length(problems) == 0) TRUE else problems
  })
msg <- tryCatch(new("Range", lo = c(1, 2), hi = numeric(0)), error = function(e) conditionMessage(e))
cat(msg)

Đầu ra:

invalid class “Range” object: 1: lo must be one number
invalid class “Range” object: 2: hi must be one number

@<- kiểm tra kiểu dữ liệu nhưng không chạy hàm kiểm tra tính hợp lệ, nên phép gán có thể vi phạm một quy tắc. validObject() chạy lại bước kiểm tra; hãy gọi hàm này sau khi thay đổi các slot:

setClass("Account", slots = c(balance = "numeric"),
  validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
a <- new("Account", balance = 10)
a@balance <- -99
cat("still created:", a@balance, "\n")
msg <- tryCatch(validObject(a), error = function(e) conditionMessage(e))
cat(msg, "\n")

Đầu ra:

still created: -99 
invalid class “Account” object: balance must not be negative 

R đặt invalid class “Account” object: phía trước văn bản của bạn. Code hiển thị thông báo cho người dùng chỉ cần giữ lại phần sau object: :

setClass("Account", slots = c(balance = "numeric"),
  validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
msg <- tryCatch(new("Account", balance = -1), error = function(e) conditionMessage(e))
cat(sub(".*object: ", "", msg))

Đầu ra:

balance must not be negative
challenge icon

Thử thách

Dễ

Khai báo lớp Rating trong Rating.R với các slot stars (numeric) và comment (character), cùng một hàm kiểm tra tính hợp lệ trả về quy tắc đầu tiên bị vi phạm:

  • stars must be a whole number from 1 to 5 khi số sao không phải là một trong các số 1, 2, 3, 4, 5;
  • comment is too long khi nhận xét có hơn 20 ký tự.

Nếu không, hàm trả về TRUE. Code được cung cấp đọc các dòng 4;Great (có thể không có nhận xét), tạo từng đánh giá và in ra ok: 4/5 hoặc nội dung lỗi.

Code của bạn nằm trong Rating.R. main.R chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

source("Rating.R")

# Đoạn code đầu vào/đầu ra đã được cung cấp: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  p <- strsplit(line, ";")[[1]]
  out <- tryCatch({
    r <- new("Rating", stars = as.numeric(p[1]), comment = if (length(p) > 1) p[2] else "")
    paste0("ok: ", r@stars, "/5")
  }, error = function(e) sub(".*object: ", "", conditionMessage(e)))
  cat(out, "\n", sep = "")
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch R online