Funções de Acesso
Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 19 de 57.
Encapsulamento significa que outro código trabalha com um objeto por meio de funções, em vez de acessar diretamente seus campos. Um getter lê um valor e um setter o altera. Para uma lista S3, o setter retorna a cópia alterada:
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))Saída:
[1] "Ada Lovelace"Os acessadores permitem que o objeto altere a forma como armazena os dados sem quebrar o código que o utiliza. Este termômetro armazena Celsius, e um getter calcula Fahrenheit quando solicitado, para que quem chama nunca veja o próprio campo:
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))Saída:
25 77Os próprios setters do R, como names(x) <- ..., são funções de substituição. Uma função chamada "name<-" com os parâmetros x e value permite que os chamadores escrevam name(p) <- "Bo"; o R a chama e atribui o resultado novamente 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))Saída:
[1] "Bo"Um getter de um objeto de fechamento retorna uma cópia dos dados privados. Alterar essa cópia não altera o objeto, portanto, a única maneira de acessá-lo é por meio das próprias funções do 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())Saída:
[1] "milk"Desafio
FácilUm contato é uma lista S3 da classe contact com os campos name e email. Complete Contact.R:
new_contact(name, email)armazena o email removendo os espaços em branco e convertendo-o para letras minúsculas.- Os getters
contact_name(x)econtact_email(x). - A função de substituição
"contact_email<-", que armazena o novo email removendo os espaços em branco e convertendo-o para letras minúsculas, para que os chamadores possam escrevercontact_email(c1) <- value.
O código fornecido lê name,email, depois novos emails, e imprime Ada <ada@x.com> após cada alteração e os nomes dos campos armazenados ao final.
Seu código deve ficar em Contact.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
source("Contact.R")
# Código de entrada/saída fornecido: mantenha-o 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 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
1Fundamentos do S3
Trabalhando com ArquivosListas com uma ClasseFunções ConstrutorasMétodos de Impressão e FormataçãoValidadores e AuxiliaresRevisão - Temperaturas4Encapsulamento em R
Closures como ObjetosAmbientes como ObjetosFunções de AcessoProtegendo o EstadoRecapitulação - Parquímetro2Genéricos e Métodos S3
Genéricos e UseMethodMétodos padrãoMétodos para genéricos baseFundamentos de NextMethodRevisão - Áreas de formas5Classes S4
Definindo classes S4Slots e acessoVerificações de validadeMétodos showRevisão - Catálogo de produtos8Classes de Referência
Definindo Classes de ReferênciaMétodos e Atualizações de CamposSemântica de CópiaHerança e callSuperRecapitulação — Fila de Tarefas11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de R online