Menu
CoddyTech

Ôn tập: phương thức thanh toán

Thuộc phần Lập trình hướng đối tượng trong hành trình Ruby của Coddy. Bài học 36 trên 57.

challenge icon

Thử thách

Khó

Xây dựng quy trình thanh toán bằng tính đa hình, phương thức trừu tượng và duck typing. PaymentMethod#charge(amount) là một phương thức mẫu: phương thức này trả về nil khi available?(amount) là false, nếu không thì trả về card paid 50.00, fee 1.00, sử dụng label và fee(amount) trừu tượng, vốn sẽ phát sinh NotImplementedError trong PaymentMethod. available? là một hook trả về true. Card tính phí 2%; PayPal tính 0.30 cộng thêm 3%; GiftCard.new(balance) không tính phí, chỉ khả dụng khi số dư đủ để thanh toán số tiền và sẽ giảm số dư. Voucher.new(value) không phải là PaymentMethod: đối tượng này chỉ có charge(amount) riêng, trả về voucher covered 20.00 khi giá trị đủ để thanh toán số tiền và trả về nil nếu không đủ. Hàm trợ giúp checkout(amount, methods) trong functions.rb lần lượt thử phương thức charge của từng phương thức thanh toán và trả về kết quả đầu tiên, hoặc declined.

Dòng đầu tiên của đầu vào liệt kê các phương thức thanh toán, chẳng hạn như gift:30,voucher:20,card. Mỗi dòng tiếp theo là số tiền của một đơn hàng; code được cung cấp sẽ in kết quả của checkout cho từng đơn hàng.

Code của bạn nằm trong các tệp payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb và functions.rb. main.rb chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.

Tự làm thử

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

# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên
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) }

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Ruby online