ספרים וחברים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Kotlin של Coddy. שיעור 50 מתוך 57.
בפרויקט הזה תבנה את הליבה של מערכת ספרייה. מחלקה מסוג Library מקבלת פקודות, אחת בכל שורה, ומשיבה לכל אחת מהן. במהלך חמישה שלבים היא לומדת להוסיף ספרים וחברים, להשאיל ספרים ולהחזיר אותם, לחפש בקטלוג ולהדפיס דוח:
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTמודל הנתונים משתמש במה שנלמד ביחידה הזאת. Book ו-Member נמצאים כל אחד בקובץ משלו. אפשר לקרוא את borrower של ספר מכל מקום, אבל לשנות אותו רק באמצעות lendTo ו-giveBack, וחבר חושף את מזהי ההשאלות שלו בתור List לקריאה בלבד. הספרייה שומרת את שניהם במפות פרטיות, כך שרק המתודות שלה יכולות לשנות אותם:
class Book(val id: Int, val title: String) {
var borrower: String? = null
private set
val isAvailable: Boolean
get() = borrower == null
fun lendTo(name: String) { borrower = name }
}בתוך main:
val books = mutableMapOf<Int, Book>()
books[1] = Book(1, "Dune")
books.getValue(1).lendTo("ada")
println("${books.getValue(1).isAvailable} ${books.getValue(1).borrower}")פלט:
false adahandle(line) מפצלת את הפקודה ומשתמשת ב-when על המילה הראשונה שלה. כל ענף מחזיר את התגובות שלו כ-List<String>, כך שפקודה כמו REPORT יכולה להשיב בכמה שורות, ו-return מוקדם מחזיר סירוב. הכותרת של ספר עשויה להכיל רווחים, ולכן היא כוללת את כל מה שמופיע אחרי המזהה:
בתוך main:
val p = "ADD_BOOK 7 The Hobbit".split(" ")
val id = p[1].toInt()
val title = p.drop(2).joinToString(" ")
println("$id: $title")פלט:
7: The Hobbitאתגר
קלהשלימו את Library.handle(line) עבור שתי הפקודות הראשונות:
ADD_BOOK <id> <title>: שמרו ספר חדש וזמין והשיבוadded book 1: Dune; אם המזהה כבר תפוס, השיבוbook 1 exists.JOIN <name>: הוסיפו חבר והשיבוwelcome ada; אם השם כבר קיים, השיבוada is already a member.
הקוד שסופק מעביר כל שורת קלט אל library.handle(line) ומדפיס כל תשובה שהוחזרה בשורה נפרדת. שמות החברים הם מילים בודדות באותיות קטנות, מזהי הספרים הם מספרים שלמים, והקלט מכיל רק את הפקודות שתוארו עד כה. כל פקודה אחרת משיבה unknown command.
כתבו את הקוד שלכם בקבצים Book.kt, Member.kt ו-Library.kt. הקובץ Main.kt מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
fun main() {
// קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
val input = generateSequence(::readLine).toList()
val library = Library()
for (line in input) {
for (reply in library.handle(line)) println(reply)
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מחלקות ואובייקטים
עבודה עם קבציםהגדרת מחלקותבנאים ראשייםבלוקי init ואימות נתוניםבנאים משנייםסיכום – כרטיס ספרייהתרגלו בעצמכם: Kotlin אונליין