Menu
Coddy logo textTech

Rückblick – Zahlungsmethoden

Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 36 von 57.

challenge icon

Aufgabe

Schwer

Erstelle einen Checkout mit Polymorphie, einer abstrakten Methode und Duck Typing. PaymentMethod#charge(amount) ist eine Template-Methode: Sie gibt nil zurück, wenn available?(amount) false ist, und gibt andernfalls card paid 50.00, fee 1.00 zurück, wobei label und die abstrakte Methode fee(amount) verwendet werden, die in PaymentMethod NotImplementedError auslöst. available? ist ein Hook, der true zurückgibt. Card berechnet eine Gebühr von 2 %; PayPal 0.30 plus 3 %; GiftCard.new(balance) berechnet keine Gebühr, ist nur verfügbar, solange das Guthaben den Betrag abdeckt, und verringert das Guthaben. Voucher.new(value) ist kein PaymentMethod: Es verfügt nur über ein eigenes charge(amount), das voucher covered 20.00 zurückgibt, wenn der Wert den Betrag abdeckt, und andernfalls nil. Der Helfer checkout(amount, methods) in functions.rb versucht die Methode charge jedes Zahlungsmittels der Reihe nach und gibt das erste Ergebnis oder declined zurück.

Die erste Eingabezeile listet die Zahlungsmethoden auf, zum Beispiel gift:30,voucher:20,card. Jede folgende Zeile enthält einen Bestellbetrag; der bereitgestellte Code gibt für jeden Betrag das Ergebnis von checkout aus.

Dein Code gehört in payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb und functions.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

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

# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
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) }

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Ruby-Compiler