Menu
Coddy logo textTech

Riepilogo - Metodi di pagamento

Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 36 di 57.

challenge icon

Sfida

Difficile

Crea un checkout con polimorfismo, un metodo astratto e duck typing. PaymentMethod#charge(amount) è un metodo template: restituisce nil quando available?(amount) è false e, altrimenti, restituisce card paid 50.00, fee 1.00, usando label e il metodo astratto fee(amount), che genera NotImplementedError in PaymentMethod. available? è un hook che restituisce true. Card applica una commissione del 2%; PayPal 0.30 più il 3%; GiftCard.new(balance) non applica commissioni, è disponibile solo se il saldo copre l'importo e riduce il saldo. Voucher.new(value) non è un PaymentMethod: ha solo il proprio charge(amount), che restituisce voucher covered 20.00 quando il valore copre l'importo e nil altrimenti. La funzione di supporto checkout(amount, methods) in functions.rb prova il metodo charge di ciascun metodo nell'ordine e restituisce il primo risultato oppure declined.

La prima riga di input elenca i metodi di pagamento, ad esempio gift:30,voucher:20,card. Ogni riga successiva indica l'importo di un ordine; il codice fornito stampa il risultato di checkout per ciascuno.

Il tuo codice va inserito in payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb e functions.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

require_relative 'payment_method'
require_relative 'card'
require_relative 'pay_pal'
require_relative 'gift_card'
require_relative 'voucher'
require_relative 'functions'

# Codice di input/output fornito: lascialo così com'è
input = []
while (line = gets)
  input << line.chomp
end
methods = input[0].split(",").map do |entry|
  kind, value = entry.split(":")
  case kind
  when "card" then Card.new
  when "paypal" then PayPal.new
  when "gift" then GiftCard.new(value.to_f)
  else Voucher.new(value.to_f)
  end
end
input.drop(1).each { |line| puts checkout(line.to_f, methods) }

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Ruby online