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