Menu
CoddyTech

الكتب والأعضاء

جزء من قسم البرمجة كائنية التوجه في رحلة 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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Kotlin