ספרים וחברים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 50 מתוך 57.
בפרויקט הזה תבנה את הליבה של מערכת ספרייה. אובייקט Library מקבל פקודות, אחת בכל שורה, ומשיב לכל אחת מהן. בחמישה שלבים הוא ילמד להוסיף ספרים וחברים, להשאיל ספרים ולקבל אותם בחזרה, לחפש בקטלוג ולהדפיס דוח.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTמודל הנתונים משתמש במה שנלמד ביחידה הזאת. Book חושפת את id ואת title לקריאה בלבד, ואת borrower באמצעות גישה, עם הפרדיקט available?. Member שומרת את המזהים של ההשאלות שלה במערך. כל מחלקה נמצאת בקובץ משלה, book.rb, member.rb ו-library.rb, והספרייה שומרת את שני סוגי האובייקטים בגיבובים שרק המתודות שלה ניגשות אליהם:
class Book
attr_reader :id, :title
attr_accessor :borrower
def initialize(id, title)
@id = id
@title = title
@borrower = nil
end
def available?
borrower.nil?
end
end
books = { 1 => Book.new(1, "Dune") }
books[1].borrower = "ada"
puts books[1].available?פלט:
falsehandle(line) מפצלת את הפקודה ומנתבת לפי המילה הראשונה שלה באמצעות case. כל ענף מחזיר את התשובות שלו כמערך, כך שפקודה כמו REPORT יכולה להשיב בכמה שורות, ו-return יוצאת מוקדם עם תשובת שגיאה. כותרת של ספר יכולה להכיל רווחים, ולכן היא כוללת את כל מה שמופיע אחרי המזהה:
parts = "ADD_BOOK 7 The Hobbit".split
id = parts[1].to_i
title = parts[2..].join(" ")
puts "#{id}: #{title}"פלט:
7: The Hobbitאתגר
קלהשלימו את Library#handle עבור שתי הפקודות הראשונות:
ADD_BOOK id title: שמרו ספר חדש וזמין והשיבוadded book 1: Dune; אם המזהה כבר תפוס, השיבוbook 1 exists.JOIN name: הוסיפו חבר והשיבוwelcome ada; אם השם כבר קיים, השיבוada is already a member.
הקוד שסופק מעביר כל שורת קלט אל library.handle(line) ומדפיס כל תשובה שהוחזרה בשורה נפרדת. שמות החברים הם מילים בודדות באותיות קטנות, מזהי הספרים הם מספרים שלמים, והקלט מכיל רק את הפקודות שתוארו עד כה. כל פקודה אחרת משיבה unknown command.
כתבו את הקוד בקבצים book.rb, member.rb ו־library.rb. הקובץ main.rb מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
require_relative 'book'
require_relative 'member'
require_relative 'library'
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input = []
while (line = gets)
input << line.chomp
end
library = Library.new
input.each do |line|
library.handle(line).each { |reply| puts reply }
end
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין