Pattern Strategy
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 45 di 57.
Il modello strategia rende sostituibile un algoritmo: il codice che ne ha bisogno lo riceve come argomento. In R una funzione è un valore, quindi la strategia è una funzione passata come argomento e chi la chiama sceglie quale usare:
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"Un elenco con nome di strategie consente al programma di sceglierne una in base al nome durante l’esecuzione, ad esempio dall’input dell’utente:
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 Le strategie con impostazioni vengono create da factory. percent_off(10) restituisce una nuova funzione strategia che memorizza la percentuale:
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 70Un oggetto può contenere la propria strategia in un campo e sostituirla in seguito. Il resto dell'oggetto rimane invariato:
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))Risultato:
[1] "fig" "pear" "banana"
[1] "banana" "fig" "pear" Sfida
FacileLa spedizione viene scelta in base a una strategia: una funzione del peso totale del carrello e del suo subtotale che restituisce il costo di spedizione. In Strategies.R scrivi:
standard(kg, subtotal): 4.99 più 1 per kg;express(kg, subtotal): il doppio del costo standard;free_over(limit): restituisce una strategia che costa 0 quando il subtotale è almenolimite, altrimenti, il costo standard.
In Cart.R, new_cart(strategy) e add_item() sono già forniti; completa subtotal(cart) e shipping_cost(cart), che richiama la strategia del carrello. Il codice fornito legge la strategia (standard, express o free_over 50), poi gli articoli book 12 0.5 (nome, prezzo, kg) e stampa i totali.
Il tuo codice va inserito in Strategies.R e Cart.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Strategies.R")
source("Cart.R")
# Codice di input/output fornito: lascialo così com'è
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 = "")
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Nozioni di base su S3
Lavorare con i fileListe con una classeFunzioni costruttriciMetodi di stampa e formattazioneValidatori e funzioni di supportoRipasso - Temperature4Incapsulamento in R
Chiusure come oggettiAmbienti come oggettiFunzioni di accessoProteggere lo statoRiepilogo - Parcometro2Generics e metodi S3
Generics e UseMethodMetodi predefinitiMetodi per i generics di baseNozioni di base su NextMethodRiepilogo - Aree delle forme5Classi S4
Definire le classi S4Slot e accessoControlli di validitàMetodi showRiepilogo - Catalogo prodotti8Classi di riferimento
Definizione delle classi di riferimentoMetodi e aggiornamenti dei campiSemantica della copiaEreditarietà e callSuperRiepilogo - coda di attività11Progetto: Gestione della biblioteca
Libri e iscrittiPrestito dei libriEsercitati da solo: Compilatore R online