Funciones de acceso
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 19 de 57.
Encapsulamiento significa que otro código trabaja con un objeto mediante funciones en lugar de acceder directamente a sus campos. Un getter lee un valor y un setter lo cambia. Para una lista S3, el setter devuelve la copia modificada:
new_member <- function(name) structure(list(name = name), class = "member")
get_name <- function(p) p$name
set_name <- function(p, value) {
p$name <- value
p
}
p <- new_member("ada")
p <- set_name(p, "Ada Lovelace")
print(get_name(p))Salida:
[1] "Ada Lovelace"Los accesores permiten que el objeto cambie la forma en que almacena los datos sin romper el código que lo utiliza. Este termómetro almacena grados Celsius, y un getter calcula los grados Fahrenheit cuando se solicitan, de modo que quienes llaman nunca ven el campo en sí:
new_thermo <- function(c) structure(list(c = c), class = "thermo")
celsius <- function(t) t$c
fahrenheit <- function(t) t$c * 9 / 5 + 32
t <- new_thermo(25)
cat(celsius(t), fahrenheit(t))Salida:
25 77Los propios setters de R, como names(x) <- ..., son funciones de reemplazo. Una función llamada "name<-" con los parámetros x y value permite a quienes llaman escribir name(p) <- "Bo"; R la llama y asigna el resultado nuevamente a p:
new_member <- function(name) structure(list(name = name), class = "member")
name <- function(p) p$name
"name<-" <- function(x, value) {
x$name <- trimws(value)
x
}
p <- new_member("ada")
name(p) <- " Bo "
print(name(p))Salida:
[1] "Bo"Un getter de un objeto de cierre devuelve una copia de los datos privados. Cambiar esa copia no cambia el objeto, por lo que la única forma de acceder a él es mediante las propias funciones del objeto:
make_list <- function() {
items <- character(0)
list(add = function(x) items <<- c(items, x),
get_items = function() items)
}
todo <- make_list()
todo$add("milk")
mine <- todo$get_items()
mine[1] <- "HACKED"
print(todo$get_items())Salida:
[1] "milk"Desafío
FácilUn contacto es una lista S3 de clase contact con los campos name y email. Completa Contact.R:
new_contact(name, email)almacena el correo electrónico sin espacios al inicio ni al final y en minúsculas.- Los getters
contact_name(x)ycontact_email(x). - La función de reemplazo
"contact_email<-", que almacena el nuevo correo electrónico sin espacios al inicio ni al final y en minúsculas, para que quienes llaman puedan escribircontact_email(c1) <- value.
El código proporcionado lee name,email, después los nuevos correos electrónicos, e imprime Ada <ada@x.com> después de cada cambio y los nombres de los campos almacenados al final.
Tu código va en Contact.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
source("Contact.R")
# Código de entrada/salida suministrado: déjalo como está
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ",")[[1]]
c1 <- new_contact(p[1], p[2])
cat(contact_name(c1), " <", contact_email(c1), ">\n", sep = "")
for (value in input[-1]) {
contact_email(c1) <- value
cat(contact_name(c1), " <", contact_email(c1), ">\n", sep = "")
}
cat("stored fields: ", paste(names(unclass(c1)), collapse = ", "), "\n", sep = "")
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de S3
Trabajar con archivosListas con una claseFunciones constructorasMétodos de impresión y formatoValidadores y auxiliaresRepaso: temperaturas4Encapsulación en R
Cierres como objetosEntornos como objetosFunciones de accesoProtección del estadoRepaso: parquímetro2S3 Genéricos y métodos
Genéricos y UseMethodMétodos predeterminadosMétodos para genéricos baseFundamentos de NextMethodRepaso: áreas de figuras5Clases S4
Definición de clases S4Slots y accesoComprobaciones de validezMétodos showRepaso - Catálogo de productos8Clases de referencia
Definición de clases de referenciaMétodos y actualizaciones de camposSemántica de copiaHerencia y callSuperRepaso: cola de tareas11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de R online