Menu
Coddy logo textTech

Verificações de validade

Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 24 de 57.

Os tipos são verificados pelo R; as regras sobre os valores são suas. O argumento validity de setClass() é uma função de object que retorna TRUE quando o objeto está correto, ou uma cadeia de caracteres descrevendo o problema. new() a executa para cada objeto:

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)

Saída:

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

Uma função de validade pode relatar vários problemas de uma só vez retornando um vetor de caracteres. R os numera na mensagem de erro:

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)

Saída:

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

@<- verifica o tipo, mas não executa a função de validação, portanto uma atribuição pode violar uma regra. validObject() executa a verificação novamente; chame-o após alterar os slots:

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

Saída:

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

O R coloca invalid class “Account” object: antes do seu texto. O código que exibe a mensagem para um usuário pode manter apenas a parte após 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))

Saída:

balance must not be negative
challenge icon

Desafio

Fácil

Declare a classe Rating em Rating.R com os slots stars (numérico) e comment (caractere), além de uma função de validade que retorne a primeira regra violada:

  • stars must be a whole number from 1 to 5 quando as estrelas não forem um dos valores 1, 2, 3, 4, 5;
  • comment is too long quando o comentário tiver mais de 20 caracteres.

Caso contrário, ela retorna TRUE. O código fornecido lê linhas 4;Great (o comentário pode estar ausente), cria cada avaliação e imprime ok: 4/5 ou o texto do problema.

Seu código deve ser colocado em Rating.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

source("Rating.R")

# Código de entrada/saída fornecido: mantenha-o como está
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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de R online