Dekoratör Kalıbı
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 46 / 57.
Bir decorator, aynı arayüzü korurken bir şeyi sarar ve davranış ekler. Bir işlev için decorator, bir işlev alır ve çağrı etrafında ek işler yapan yeni bir işlev döndürür:
with_logging <- function(f, name) {
function(x) {
cat("calling", name, "with", x, "\n")
f(x)
}
}
double <- function(x) x * 2
logged <- with_logging(double, "double")
print(logged(21))Çıktı:
calling double with 21
[1] 42Bir dekoratör sonuçları hatırlayabilir. with_cache() her yanıtı bir ortamda tutar ve sarılmış işlevi yalnızca yeni bağımsız değişkenler için çağırır:
with_cache <- function(f) {
cache <- new.env()
function(x) {
key <- as.character(x)
if (!exists(key, envir = cache, inherits = FALSE)) assign(key, f(x), envir = cache)
get(key, envir = cache)
}
}
work <- 0
slow_square <- function(x) {
work <<- work + 1
x^2
}
fast <- with_cache(slow_square)
for (x in c(3, 4, 3, 3, 4)) fast(x)
cat("results computed:", work)Çıktı:
results computed: 2Nesneler de dekore edilebilir. Her dekoratör, sardığı nesneyi bir alanda tutan ve aynı generic'lere yanıt veren bir nesnedir; kendi parçasını ekler ve geri kalanı için iç nesneye başvurur:
cost <- function(d) UseMethod("cost")
describe <- function(d) UseMethod("describe")
cost.coffee <- function(d) 2
describe.coffee <- function(d) "coffee"
with_milk <- function(inner) structure(list(inner = inner), class = "milk")
cost.milk <- function(d) cost(d$inner) + 0.5
describe.milk <- function(d) paste(describe(d$inner), "+ milk")
cup <- with_milk(with_milk(structure(list(), class = "coffee")))
cat(describe(cup), "=", cost(cup))Çıktı:
coffee + milk + milk = 3Decorator'ler iç içe geçer ve sıraları önemlidir: en dıştaki, girişte ilk ve çıkışta son olarak çalışır:
exclaim <- function(f) function(s) paste0(f(s), "!")
twice <- function(f) function(s) paste(f(s), f(s))
greet <- function(name) paste("hi", name)
a <- twice(exclaim(greet))
b <- exclaim(twice(greet))
cat(a("ada"), "/", b("ada"))Çıktı:
hi ada! hi ada! / hi ada hi ada!Görev
Kolayİçecekler ekstralarla süslenir. Drink.R, cost() ve describe() jeneriklerini ve 2 ücret alan ve kendisini coffee olarak tanımlayan temel içeceği, new_coffee()'yi içerir. Extras.R içinde, her biri sardığı içeceği inner alanında tutan bir nesne olan üç dekoratör yazın:
add_milk(d):milksınıfı, 0.50 ve+ milkekler;add_sugar(d):sugarsınıfı, 0.20 ve+ sugarekler;add_syrup(d, flavour):flavouralanına sahipsyrupsınıfı, 0.80 ve+ vanilla syrupekler.
cost() ve describe() yöntemlerini, önce iç içe bulunan içeceğe sorarak yazın. Sağlanan kod, milk,syrup vanilla,sugar gibi satırları okur (boş bir satır sade kahvedir) ve coffee + milk + vanilla syrup + sugar: 3.50 yazdırır.
Kodunuz Drink.R ve Extras.R dosyalarına gider. main.R, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
source("Drink.R")
source("Extras.R")
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
d <- new_coffee()
if (nchar(line) > 0) for (extra in strsplit(line, ",")[[1]]) {
p <- strsplit(extra, " ")[[1]]
d <- switch(p[1], milk = add_milk(d), sugar = add_sugar(d), syrup = add_syrup(d, p[2]))
}
cat(sprintf("%s: %.2f", describe(d), cost(d)), "\n", sep = "")
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Tabanlı Programlama bölümündeki tüm dersler
1S3 Temelleri
Dosyalarla ÇalışmaSınıf ile ListelerYapıcı FonksiyonlarPrint ve Format MetotlarıDoğrulayıcılar ve YardımcılarTekrar - Sıcaklıklar4R'da Kapsülleme
Nesne Olarak Closure'larNesne Olarak OrtamlarErişimci FonksiyonlarDurumu KorumaÖzet - Parkmetre2S3 Generic'leri ve Metotları
Generic'ler ve UseMethodVarsayılan MetotlarTemel Generic'ler için MetotlarNextMethod TemelleriTekrar - Şekil Alanları5S4 Sınıfları
S4 Sınıflarını TanımlamaSlotlar ve ErişimGeçerlilik KontrolleriShow MetotlarıÖzet - Ürün Kataloğu8Referans Sınıfları
Referans Sınıflarını TanımlamaMetotlar ve Alan GüncellemeleriKopyalama SemantiğiKalıtım ve callSuperÖzet - Görev Kuyruğu11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Online R derleyicisi