Menu
Coddy logo textTech

ספרים וחברים

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

handle(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
challenge icon

אתגר

קל

השלימו את 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)
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Kotlin אונליין