Padrão Strategy
Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 45 de 57.
O padrão de estratégia torna um algoritmo substituível: o código que precisa dele o recebe como argumento. Em R, uma função é um valor, portanto a estratégia é uma função passada como argumento, e quem faz a chamada escolhe qual usar:
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))Saída:
[1] "pay 80"
[1] "pay 40"Uma lista nomeada de estratégias permite que o programa escolha uma pelo nome em tempo de execução, por exemplo, a partir da entrada do usuário:
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")Saída:
regular 50
member 45
staff 35 Estratégias com configurações são criadas por fábricas. percent_off(10) retorna uma nova função de estratégia que memoriza sua porcentagem:
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)))Saída:
[1] 90 75 70Um objeto pode manter sua estratégia em um campo e trocá-la posteriormente. O restante do 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))Saída:
[1] "fig" "pear" "banana"
[1] "banana" "fig" "pear" Desafio
FácilO frete é escolhido por uma estratégia: uma função do peso total do carrinho e do subtotal que retorna o custo do frete. Em Strategies.R, escreva:
standard(kg, subtotal): 4.99 mais 1 por kg;express(kg, subtotal): o dobro do custo padrão;free_over(limit): retorna uma estratégia que custa 0 quando o subtotal é pelo menoslimite, caso contrário, o custo padrão.
Em Cart.R, new_cart(strategy) e add_item() são fornecidas; complete subtotal(cart) e shipping_cost(cart), que chama a estratégia do carrinho. O código fornecido lê a estratégia (standard, express ou free_over 50), depois os itens book 12 0.5 (nome, preço, kg), e imprime os totais.
Seu código deve ser colocado em Strategies.R e Cart.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
source("Strategies.R")
source("Cart.R")
# Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos do S3
Trabalhando com ArquivosListas com uma ClasseFunções ConstrutorasMétodos de Impressão e FormataçãoValidadores e AuxiliaresRevisão - Temperaturas4Encapsulamento em R
Closures como ObjetosAmbientes como ObjetosFunções de AcessoProtegendo o EstadoRecapitulação - Parquímetro2Genéricos e Métodos S3
Genéricos e UseMethodMétodos padrãoMétodos para genéricos baseFundamentos de NextMethodRevisão - Áreas de formas5Classes S4
Definindo classes S4Slots e acessoVerificações de validadeMétodos showRevisão - Catálogo de produtos8Classes de Referência
Definindo Classes de ReferênciaMétodos e Atualizações de CamposSemântica de CópiaHerança e callSuperRecapitulação — Fila de Tarefas11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de R online