Strategiemuster
Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 45 von 57.
Das Strategy-Muster macht einen Algorithmus austauschbar: Der Code, der ihn benötigt, erhält ihn als Argument. In R ist eine Funktion ein Wert, daher ist die Strategie eine übergebene Funktion, und der Aufrufer wählt aus, welche verwendet wird:
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))Ausgabe:
[1] "pay 80"
[1] "pay 40"Eine benannte Liste von Strategien ermöglicht es dem Programm, zur Laufzeit eine anhand ihres Namens auszuwählen, zum Beispiel aus einer Benutzereingabe:
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")Ausgabe:
regular 50
member 45
staff 35 Strategien mit Einstellungen werden von Factorys erstellt. percent_off(10) gibt eine neue Strategiefunktion zurück, die sich ihren Prozentsatz merkt:
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)))Ausgabe:
[1] 90 75 70Ein Objekt kann seine Strategie in einem Feld speichern und sie später austauschen. Der Rest des Objekts bleibt gleich:
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))Ausgabe:
[1] "fig" "pear" "banana"
[1] "banana" "fig" "pear" Aufgabe
EinfachDer Versand wird durch eine Strategie ausgewählt: eine Funktion des Gesamtgewichts des Warenkorbs und seiner Zwischensumme, die die Versandkosten zurückgibt. Schreibe in Strategies.R:
standard(kg, subtotal): 4.99 plus 1 pro kg;express(kg, subtotal): das Doppelte der Standardkosten;free_over(limit): gibt eine Strategie zurück, die 0 kostet, wenn die Zwischensumme mindestenslimitbeträgt, und andernfalls die Standardkosten.
In Cart.R sind new_cart(strategy) und add_item() vorgegeben; vervollständige subtotal(cart) und shipping_cost(cart), die die Strategie des Warenkorbs aufruft. Der bereitgestellte Code liest die Strategie (standard, express oder free_over 50), anschließend die Artikel book 12 0.5 (Name, Preis, kg), und gibt die Gesamtsummen aus.
Dein Code gehört in Strategies.R und Cart.R. main.R enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
source("Strategies.R")
source("Cart.R")
# Bereitgestellter Ein-/Ausgabecode: belasse ihn wie er ist
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 = "")
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1S3-Grundlagen
Arbeiten mit DateienListen mit einer KlasseKonstruktorfunktionenPrint- und Format-MethodenValidatoren und HilfsfunktionenRückblick – Temperaturen4Kapselung in R
Closures als ObjekteUmgebungen als ObjekteZugriffsfunktionenZustand schützenRückblick – Parkuhr2S3-Generics und Methoden
Generics und UseMethodStandardmethodenMethoden für Basis-GenericsGrundlagen von NextMethodWiederholung – Flächeninhalte von Formen5S4-Klassen
S4-Klassen definierenSlots und ZugriffGültigkeitsprüfungenShow-MethodenRückblick – Produktkatalog8Referenzklassen
Referenzklassen definierenMethoden und FeldänderungenKopiersemantikVererbung und callSuperZusammenfassung – Aufgabenwarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-R-Compiler