Menu
Coddy logo textTech

복습 - 결제 방식

Coddy Ruby 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 36번째.

challenge icon

챌린지

어려움

다형성, 추상 메서드 및 덕 타이핑을 사용하여 결제 처리를 구현하세요. PaymentMethod#charge(amount)는 템플릿 메서드입니다. available?(amount)가 false이면 nil을 반환하고, 그렇지 않으면 label과 PaymentMethod에서 NotImplementedError를 발생시키는 추상 메서드 fee(amount)를 사용하여 card paid 50.00, fee 1.00을 반환합니다. available?는 true를 반환하는 훅입니다. Card는 2%의 수수료를 부과하고, PayPal은 0.30에 3%를 더한 수수료를 부과합니다. GiftCard.new(balance)는 수수료를 부과하지 않으며, 잔액으로 금액을 충당할 수 있을 때만 사용 가능하고 잔액을 차감합니다. Voucher.new(value)는 PaymentMethod가 아닙니다. 자체 charge(amount)만 가지고 있으며, value로 금액을 충당할 수 있으면 voucher covered 20.00을 반환하고 그렇지 않으면 nil을 반환합니다. functions.rb의 도우미 checkout(amount, methods)는 각 메서드의 charge를 순서대로 시도하여 첫 번째 결과를 반환하고, 결과가 없으면 declined를 반환합니다.

첫 번째 입력 줄에는 gift:30,voucher:20,card와 같은 결제 수단 목록이 지정됩니다. 그다음 줄부터는 주문 금액이 하나씩 지정되며, 제공된 코드는 각 금액에 대해 checkout의 결과를 출력합니다.

코드는 payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb 및 functions.rb에 작성하세요. main.rb에는 제공된 입력/출력 코드가 들어 있으며 수정할 수 없습니다.

직접 해보기

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

# 제공된 입출력 코드: 있는 그대로 유지하세요
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) }

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Ruby 컴파일러