סיכום – אמצעי תשלום
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 36 מתוך 57.
אתגר
קשהבנו תהליך תשלום עם פולימורפיזם, מתודה מופשטת וטיפוס ברווז. PaymentMethod#charge(amount) היא מתודת תבנית: היא מחזירה nil כאשר available?(amount) מחזירה false, ובמקרה אחר מחזירה card paid 50.00, fee 1.00, תוך שימוש ב-label וב-fee(amount) המופשטת, שמעלה NotImplementedError ב-PaymentMethod. available? היא מתודת hook שמחזירה true. Card גובה עמלה של 2%; PayPal גובה 0.30 ועוד 3%; GiftCard.new(balance) אינה גובה עמלה, זמינה רק כל עוד היתרה שלה מכסה את הסכום ומפחיתה את היתרה. Voucher.new(value) אינה PaymentMethod: יש לה רק charge(amount) משלה, שמחזירה voucher covered 20.00 כאשר הערך מכסה את הסכום, ו-nil אחרת. פונקציית העזר checkout(amount, methods) שב-functions.rb מנסה את charge של כל אמצעי תשלום לפי הסדר ומחזירה את התוצאה הראשונה, או את declined.
שורת הקלט הראשונה מפרטת את אמצעי התשלום, למשל gift:30,voucher:20,card. כל שורה שאחריה היא סכום הזמנה; הקוד שסופק מדפיס את התוצאה של checkout עבור כל אחת מהן.
כתבו את הקוד שלכם בקבצים payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb ו-functions.rb. הקובץ main.rb מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.
נסו בעצמכם
require_relative 'payment_method'
require_relative 'card'
require_relative 'pay_pal'
require_relative 'gift_card'
require_relative 'voucher'
require_relative 'functions'
# קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
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) }
כל השיעורים ביחידה תכנות מונחה עצמים
3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין