Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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

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