Pola Strategy
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 45 dari 57.
Pola strategy membuat algoritma dapat diganti: kode yang membutuhkannya menerima algoritma tersebut sebagai argumen. Dalam R, fungsi adalah nilai, jadi strateginya berupa fungsi yang diteruskan, dan pemanggil memilih fungsi yang akan digunakan:
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))Output:
[1] "pay 80"
[1] "pay 40"list strategi yang diberi nama memungkinkan program memilih strategi berdasarkan namanya saat dijalankan, misalnya dari input pengguna:
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")Output:
regular 50
member 45
staff 35 Strategi dengan pengaturan dibuat oleh factory. percent_off(10) mengembalikan fungsi strategi baru yang mengingat persentasenya:
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)))Output:
[1] 90 75 70Sebuah object dapat menyimpan strateginya dalam sebuah field dan menggantinya nanti. Bagian lain dari object tetap sama:
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))Output:
[1] "fig" "pear" "banana"
[1] "banana" "fig" "pear" Tantangan
MudahPengiriman dipilih berdasarkan strategi: fungsi dari berat total keranjang dan subtotalnya yang mengembalikan biaya pengiriman. Tulis di Strategies.R:
standard(kg, subtotal): 4.99 ditambah 1 per kg;express(kg, subtotal): dua kali biaya standar;free_over(limit): mengembalikan strategi yang biayanya 0 jika subtotal setidaknyalimit, dan biaya standar jika tidak.
Di Cart.R, new_cart(strategy) dan add_item() sudah diberikan; lengkapi subtotal(cart) dan shipping_cost(cart), yang memanggil strategi keranjang. Kode yang disediakan membaca strategi (standard, express atau free_over 50), lalu item book 12 0.5 (nama, harga, kg), kemudian mencetak totalnya.
Tulis kodemu di Strategies.R dan Cart.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
source("Strategies.R")
source("Cart.R")
# Kode input/output yang disediakan: biarkan apa adanya
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 = "")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar S3
Bekerja dengan fileList dengan classFungsi KonstruktorMethod print dan formatValidator dan helperUlasan: Suhu4Enkapsulasi di R
Closure sebagai objectEnvironment sebagai objectFungsi accessorMelindungi stateRangkuman: Meter Parkir2S3 Generics dan Method
Generics dan UseMethodMethod DefaultMethod untuk Base GenericsDasar-Dasar NextMethodRekap: Luas Bangun5S4 class
Mendefinisikan class S4Slots dan AksesPemeriksaan ValiditasMethod showRingkasan: Katalog Produk8Kelas Referensi
Mendefinisikan Kelas ReferensiPembaruan method dan fieldSemantik PenyalinanPewarisan dan callSuperRangkuman: Antrean Tugas11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam BukuLatihan sendiri: Compiler R online