Menu
Coddy logo textTech

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

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