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.
Desafio
DifícilCrie 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
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online