Patrón Strategy
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 45 de 57.
El patrón de estrategia hace que un algoritmo sea reemplazable: el código que lo necesita lo recibe como argumento. En R una función es un valor, así que la estrategia es una función que se pasa, y quien llama elige cuál:
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))Salida:
[1] "pay 80"
[1] "pay 40"Una lista con nombre de estrategias permite que el programa elija una por su nombre durante la ejecución, por ejemplo, a partir de la entrada del usuario:
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")Salida:
regular 50
member 45
staff 35 Las estrategias con configuraciones se crean mediante fábricas. percent_off(10) devuelve una nueva función de estrategia que recuerda su porcentaje:
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)))Salida:
[1] 90 75 70Un objeto puede mantener su estrategia en un campo y cambiarla más tarde. El resto del objeto permanece igual:
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))Salida:
[1] "fig" "pear" "banana"
[1] "banana" "fig" "pear" Desafío
FácilEl envío se elige mediante una estrategia: una función del peso total del carrito y su subtotal que devuelve el costo de envío. En Strategies.R, escribe:
standard(kg, subtotal): 4.99 más 1 por kg;express(kg, subtotal): el doble del costo estándar;free_over(limit): devuelve una estrategia que cuesta 0 cuando el subtotal es al menoslimity, en caso contrario, el costo estándar.
En Cart.R, se proporcionan new_cart(strategy) y add_item(); completa subtotal(cart) y shipping_cost(cart), que llama a la estrategia del carrito. El código proporcionado lee la estrategia (standard, express o free_over 50), después los artículos book 12 0.5 (nombre, precio, kg), y muestra los totales.
Tu código va en Strategies.R y Cart.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
source("Strategies.R")
source("Cart.R")
# Código de entrada/salida suministrado: déjalo tal como está
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 = "")
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de S3
Trabajar con archivosListas con una claseFunciones constructorasMétodos de impresión y formatoValidadores y auxiliaresRepaso: temperaturas4Encapsulación en R
Cierres como objetosEntornos como objetosFunciones de accesoProtección del estadoRepaso: parquímetro2S3 Genéricos y métodos
Genéricos y UseMethodMétodos predeterminadosMétodos para genéricos baseFundamentos de NextMethodRepaso: áreas de figuras5Clases S4
Definición de clases S4Slots y accesoComprobaciones de validezMétodos showRepaso - Catálogo de productos8Clases de referencia
Definición de clases de referenciaMétodos y actualizaciones de camposSemántica de copiaHerencia y callSuperRepaso: cola de tareas11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de R online