ספרים ומנויים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 TRUEhandle(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אתגר
קלהמחלקות 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 = "")
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורותתרגלו בעצמכם: קומפיילר R אונליין