Menu
CoddyTech

ספרים ומנויים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 50 מתוך 57.

בפרויקט הזה תבנו את הליבה של מערכת ספרייה באמצעות מחלקות ייחוס, כי ספרים וחברים משתנים בזמן שהתוכנית פועלת: משאילים ספר ומחזירים אותו, ורשימת ההשאלות של חבר מתארכת ומתקצרת. אובייקט Library מקבל פקודות, אחת בכל שורה, ומשיב לכל אחת מהן. במהלך חמישה שלבים הוא ילמד להוסיף ספרים וחברים, להשאיל ספרים ולקבל אותם בחזרה, לחפש בקטלוג ולהדפיס דוח.

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

לתוכנית יש מחלקה אחת בכל קובץ. Book.R ו־Member.R מכילים את שתי המחלקות הקטנות, ו־Library.R מכיל את המחלקה ששומרת אותן בשתי רשימות בעלות שמות ומטפלת בפקודות. מכיוון שאובייקטים מסוג RC הם הפניות, שינוי ספר שנשלף מהרשימה משנה את הספר בספרייה:

Book <- setRefClass("Book", fields = list(id = "numeric", title = "character", borrower = "character"))
books <- list()
books[["7"]] <- Book$new(id = 7, title = "Dune")
b <- books[["7"]]
b$borrower <- "ada"
cat(books[["7"]]$borrower, is.null(books[["9"]]))

פלט:

ada TRUE

handle(line) מפצלת את הפקודה ומשתמשת ב-switch() על המילה הראשונה שלה כדי לקרוא למתודה של הפקודה הזו. כל מתודה מחזירה את התשובות שלה בתור וקטור תווים, כך שפקודה כמו REPORT יכולה להחזיר כמה שורות. כותרת יכולה להכיל רווחים, ולכן היא כוללת את כל מה שמופיע אחרי המזהה:

p <- strsplit("ADD_BOOK 7 The Hobbit", " ")[[1]]
id <- as.numeric(p[2])
title <- paste(p[-(1:2)], collapse = " ")
cat(id, title, sep = ": ")

פלט:

7: The Hobbit
challenge icon

אתגר

קל

המחלקות Book (שדות id, title, borrower) ו-Member (שדות name, borrowed) נתונות. השלימו שתי מתודות של Library בקובץ Library.R:

  • add_book(id, title) עבור ADD_BOOK <id> <title>: שמרו ספר חדש תחת as.character(id) והשיבו added book 1: Dune; אם המזהה כבר תפוס, השיבו book 1 exists.
  • join(name) עבור JOIN <name>: שמרו חבר חדש תחת השם והשיבו welcome ada; אם השם כבר קיים, השיבו ada is already a member.

הקוד שסופק שולח כל שורת קלט אל lib$handle(line) ומדפיס כל תשובה שהוחזרה בשורה נפרדת. שמות החברים הם מילים בודדות באותיות קטנות, מזהי הספרים הם מספרים שלמים, והקלט מכיל רק את הפקודות שתוארו עד כה. כל פקודה אחרת מחזירה unknown command.

הקוד שלכם ייכתב בקבצים Book.R, Member.R ו-Library.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.

נסו בעצמכם

source("Book.R")
source("Member.R")
source("Library.R")

# קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
  for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
quiz iconבחנו את עצמכם

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

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

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