Strateji Kalıbı
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 45 / 57.
strategy kalıbı bir algoritmayı değiştirilebilir hâle getirir: Ona ihtiyaç duyan kod, algoritmayı bağımsız değişken olarak alır. R'de bir işlev bir değerdir; dolayısıyla strateji, içeri aktarılan bir işlevdir ve çağıran taraf hangisinin kullanılacağını seçer:
no_discount <- function(total) total
half_price <- function(total) total / 2
checkout <- function(total, discount = no_discount) {
paste("pay", discount(total))
}
print(checkout(80))
print(checkout(80, half_price))Çıktı:
[1] "pay 80"
[1] "pay 40"Adlandırılmış bir strateji listesi, programın çalışma zamanında ada göre birini seçmesine olanak tanır; örneğin kullanıcı girdisinden:
pricing <- list(
regular = function(p) p,
member = function(p) p * 0.9,
staff = function(p) p * 0.7
)
for (who in c("regular", "member", "staff")) cat(who, pricing[[who]](50), "\n")Çıktı:
regular 50
member 45
staff 35 Ayarları olan stratejiler fabrikalar tarafından oluşturulur. percent_off(10), yüzdesini hatırlayan yeni bir strateji işlevi döndürür:
percent_off <- function(pct) function(total) total * (1 - pct / 100)
fixed_off <- function(amount) function(total) max(0, total - amount)
rules <- list(percent_off(10), percent_off(25), fixed_off(30))
print(vapply(rules, function(r) r(100), numeric(1)))Çıktı:
[1] 90 75 70Bir nesne, stratejisini bir alanda tutabilir ve daha sonra bunu değiştirebilir. Nesnenin geri kalanı aynı kalır:
new_sorter <- function(key) structure(list(key = key), class = "sorter")
sort_with <- function(s, words) words[order(s$key(words))]
by_length <- function(w) nchar(w)
by_last_letter <- function(w) substring(w, nchar(w))
s <- new_sorter(by_length)
words <- c("pear", "fig", "banana")
print(sort_with(s, words))
s$key <- by_last_letter
print(sort_with(s, words))Çıktı:
[1] "fig" "pear" "banana"
[1] "banana" "fig" "pear" Görev
KolayKargo, sepetin toplam ağırlığını ve ara toplamını alan ve kargo ücretini döndüren bir işlev olan bir stratejiyle seçilir. Strategies.R içinde şunları yazın:
standard(kg, subtotal): 4.99 artı kg başına 1;express(kg, subtotal): standart ücretin iki katı;free_over(limit): ara toplam en azlimitolduğunda 0 ücret alan, aksi durumda standart ücreti kullanan bir strateji döndürür.
Cart.R içinde new_cart(strategy) ve add_item() verilmiştir; sepetin stratejisini çağıran subtotal(cart) ve shipping_cost(cart) işlevlerini tamamlayın. Sağlanan kod stratejiyi (standard, express veya free_over 50), ardından öğeleri (book 12 0.5 — ad, fiyat, kg) okur ve toplamları yazdırır.
Kodunuz Strategies.R ve Cart.R dosyalarına gitmelidir. main.R sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.
Kendin dene
source("Strategies.R")
source("Cart.R")
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], " ")[[1]]
rule <- if (p[1] == "free_over") free_over(as.numeric(p[2])) else get(p[1])
cart <- new_cart(rule)
for (line in input[-1]) {
q <- strsplit(line, " ")[[1]]
cart <- add_item(cart, q[1], as.numeric(q[2]), as.numeric(q[3]))
}
cat(sprintf("items: %.2f, shipping: %.2f, total: %.2f", subtotal(cart), shipping_cost(cart), subtotal(cart) + shipping_cost(cart)), "\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