Menu
Coddy logo textTech

Vérifications de validité

Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 24 sur 57.

Les types sont vérifiés par R ; les règles concernant les valeurs vous incombent. L’argument validity de setClass() est une fonction de object qui renvoie TRUE lorsque l’objet est correct, ou une chaîne de caractères décrivant le problème. new() l’exécute pour chaque objet :

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)

Sortie :

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

Une fonction de validité peut signaler plusieurs problèmes à la fois en renvoyant un vecteur de chaînes de caractères. R les numérote dans le message d’erreur :

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)

Sortie :

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

@<- vérifie le type, mais n’exécute pas la fonction de validité, donc une affectation peut enfreindre une règle. validObject() relance la vérification appelez-la après avoir modifié les 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")

Sortie :

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

R place invalid class “Account” object: devant votre texte. Le code qui affiche le message à l’utilisateur peut ne conserver que la partie aprè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))

Sortie :

balance must not be negative
challenge icon

Défi

Facile

Déclarez la classe Rating dans Rating.R avec les emplacements stars (numérique) et comment (chaîne de caractères), ainsi qu’une fonction de validation qui renvoie la première règle enfreinte :

  • stars must be a whole number from 1 to 5 lorsque le nombre d’étoiles n’est pas l’un des nombres 1, 2, 3, 4 ou 5 ;
  • comment is too long lorsque le commentaire comporte plus de 20 caractères.

Sinon, elle renvoie TRUE. Le code fourni lit les lignes 4;Great (le commentaire peut être absent), crée chaque évaluation et affiche ok: 4/5 ou le texte du problème.

Votre code doit être placé dans Rating.R. main.R contient le code fourni d’entrée/sortie et ne peut pas être modifié.

Essayez vous-même

source("Rating.R")

# Code d'entrée/sortie fourni : le garder tel quel
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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur R en ligne