ספרים וחברים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Swift של Coddy. שיעור 50 מתוך 57.
בפרויקט הזה תבנו את הליבה של מערכת ספרייה. מחלקת Library מקבלת פקודות, אחת בכל שורה, ומשיבה לכל אחת מהן. בחמישה שלבים היא לומדת להוסיף ספרים וחברים, להשאיל ולהחזיר ספרים, לחפש בקטלוג ולהדפיס דוח.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTמודל הנתונים משתמש בכלים של יחידה זו. Book הוא מבנה נתונים: ערך שה־borrower שלו משתנה. Member היא מחלקה, כי הספרייה ורשימת ההשאלות של חבר מתייחסות לאותו אדם. הספרייה שומרת את שניהם במילונים פרטיים, כך שרק המתודות שלה יכולות לשנות אותם:
struct Book {
let id: Int
let title: String
var borrower: String? = nil
var isAvailable: Bool { borrower == nil }
}
var books: [Int: Book] = [:]
books[1] = Book(id: 1, title: "Dune")
books[1]!.borrower = "ada"
print(books[1]!.isAvailable)פלט:
falsehandle(_:) מפצלת את הפקודה ובודקת את המילה הראשונה שלה. כל ענף מחזיר את התשובות שלו כמערך, כך שפקודה כמו REPORT יכולה להחזיר כמה שורות. הכותרת של ספר יכולה להכיל רווחים, ולכן היא כוללת את כל מה שמופיע אחרי המזהה:
let p = "ADD_BOOK 7 The Hobbit".split(separator: " ").map(String.init)
let id = Int(p[1])!
let title = p.dropFirst(2).joined(separator: " ")
print("\(id): \(title)")פלט:
7: The Hobbitאתגר
קלהשלם את Library.handle(_:) עבור שתי הפקודות הראשונות:
ADD_BOOK <id> <title>: שמור ספר חדש שזמין להשאלה והשבadded book 1: Dune; אם המזהה כבר תפוס, השבbook 1 exists.JOIN <name>: הוסף חבר והשבwelcome ada; אם השם כבר קיים, השבada is already a member.
הקוד שסופק מעביר כל שורת קלט אל library.handle(_:) ומדפיס כל תשובה שהוחזרה בשורה נפרדת. שמות החברים הם מילים בודדות באותיות קטנות, מזהי הספרים הם מספרים שלמים, והקלט מכיל רק את הפקודות שתוארו עד כה. כל פקודה אחרת מחזירה unknown command.
יש לכתוב את הקוד שלך בקבצים Book.swift, Member.swift ו-Library.swift. הקובץ main.swift מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
// קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var input: [String] = []
while let line = readLine() { input.append(line) }
let library = Library()
for line in input {
for reply in library.handle(line) { print(reply) }
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
תרגלו בעצמכם: Swift אונליין