Menu
CoddyTech

Ringkasan: Method Pembayaran

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 36 dari 57.

challenge icon

Tantangan

Sulit

Buat checkout dengan polimorfisme, method abstrak, dan duck typing. PaymentMethod#charge(amount) adalah template method: method ini mengembalikan nil saat available?(amount) bernilai false, dan jika tidak, mengembalikan card paid 50.00, fee 1.00, menggunakan label dan fee(amount) yang abstrak, yang memunculkan NotImplementedError di PaymentMethod. available? adalah hook yang mengembalikan true. Card mengenakan biaya 2%; PayPal mengenakan 0.30 ditambah 3%; GiftCard.new(balance) tidak mengenakan biaya, hanya tersedia selama saldonya cukup untuk membayar jumlah tersebut, dan mengurangi saldo. Voucher.new(value) bukan PaymentMethod: voucher ini hanya memiliki charge(amount) sendiri, yang mengembalikan voucher covered 20.00 saat nilainya cukup untuk membayar jumlah tersebut, dan nil jika tidak. Fungsi helper checkout(amount, methods) di functions.rb mencoba method setiap metode secara berurutan dan mengembalikan hasil pertama, atau declined.

Baris input pertama mencantumkan metode pembayaran, seperti gift:30,voucher:20,card. Setiap baris berikutnya berisi jumlah pesanan; kode yang disediakan mencetak hasil checkout untuk setiap pesanan.

Tulis kodemu di payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb, dan functions.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

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

# Kode input/output yang disediakan: biarkan apa adanya
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) }

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online