Riepilogo - Metodi di pagamento
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 36 di 57.
Sfida
DifficileCrea 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
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online