Menu
Coddy logo textTech

Revisão - Métodos de Pagamento

Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 36 de 57.

challenge icon

Desafio

Difícil

Crie um checkout com polimorfismo, um método abstrato e duck typing. PaymentMethod#charge(amount) é um método template: ele retorna nil quando available?(amount) é false e, caso contrário, retorna card paid 50.00, fee 1.00, usando label e o método abstrato fee(amount), que lança NotImplementedError em PaymentMethod. available? é um hook que retorna true. Card cobra uma taxa de 2%; PayPal, 0.30 mais 3%; GiftCard.new(balance) não cobra taxa, fica disponível somente enquanto seu saldo cobre o valor e reduz o saldo. Voucher.new(value) não é um PaymentMethod: ele tem apenas seu próprio charge(amount), retornando voucher covered 20.00 quando o valor cobre o valor da cobrança e nil caso contrário. O auxiliar checkout(amount, methods) em functions.rb tenta o charge de cada método na ordem e retorna o primeiro resultado ou declined.

A primeira linha de entrada lista os métodos de pagamento, como gift:30,voucher:20,card. Cada linha seguinte é o valor de um pedido; o código fornecido imprime o resultado de checkout para cada um.

Seu código deve ser colocado em payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb e functions.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

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

# Código de entrada/saída fornecido: mantenha-o como está
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) }

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de Ruby online