Menu
Coddy logo textTech

ספרים וחברים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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?

פלט:

false

handle(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
challenge icon

אתגר

קל

השלימו את 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
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Ruby אונליין