Menu
Coddy logo textTech

Powtórzenie – metody płatności

Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 36 z 57.

challenge icon

Wyzwanie

Trudny

Zbuduj proces realizacji płatności z użyciem polimorfizmu, metody abstrakcyjnej i typowania kaczego. PaymentMethod#charge(amount) to metoda szablonowa: zwraca nil, gdy available?(amount) jest fałszywe, a w przeciwnym razie zwraca card paid 50.00, fee 1.00, korzystając z label i abstrakcyjnej metody fee(amount), która zgłasza wyjątek NotImplementedError w klasie PaymentMethod. available? to metoda hakowa, która zwraca true. Card pobiera opłatę w wysokości 2%; PayPal — 0.30 plus 3%; GiftCard.new(balance) nie pobiera opłaty, jest dostępna tylko wtedy, gdy jej saldo pokrywa kwotę, i zmniejsza saldo. Voucher.new(value) nie jest obiektem klasy PaymentMethod: ma tylko własną metodę charge(amount), która zwraca voucher covered 20.00, gdy wartość pokrywa kwotę, a w przeciwnym razie nil. Funkcja pomocnicza checkout(amount, methods) w pliku functions.rb kolejno wywołuje metodę charge każdego sposobu płatności i zwraca pierwszy wynik albo declined.

Pierwszy wiersz wejścia zawiera listę sposobów płatności, na przykład gift:30,voucher:20,card. Każdy kolejny wiersz zawiera kwotę zamówienia; dostarczony kod wypisuje wynik wywołania checkout dla każdej z nich.

Twój kod umieść w plikach payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb i functions.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

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

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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) }

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Ruby online