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.
Desafío
DifícilConstruye 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
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de Ruby online