Menu
Coddy logo textTech

Repaso: métodos de pago

Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 36 de 57.

challenge icon

Desafío

Difícil

Construye un proceso de pago con polimorfismo, un método abstracto y duck typing. PaymentMethod#charge(amount) es un método plantilla: devuelve nil cuando available?(amount) es falso y, de lo contrario, devuelve card paid 50.00, fee 1.00, usando label y el método abstracto fee(amount), que genera NotImplementedError en PaymentMethod. available? es un hook que devuelve true. Card cobra una comisión del 2 %; PayPal, 0.30 más el 3 %; GiftCard.new(balance) no cobra comisión, está disponible únicamente mientras su saldo cubra el importe y reduce el saldo. Voucher.new(value) no es un PaymentMethod: solo tiene su propio charge(amount), que devuelve voucher covered 20.00 cuando el valor cubre el importe y nil en caso contrario. El ayudante checkout(amount, methods) de functions.rb prueba el charge de cada método en orden y devuelve el primer resultado o declined.

La primera línea de entrada enumera los métodos de pago, como gift:30,voucher:20,card. Cada línea posterior es el importe de un pedido; el código proporcionado imprime el resultado de checkout para cada uno.

Tu código va en payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb y functions.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

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/salida suministrado: déjalo 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 las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de Ruby online