الكتب والأعضاء
جزء من قسم البرمجة كائنية التوجه في رحلة 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التحدي
سهلأكمل 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 والتحقق من الصحةالمنشئات الثانويةمراجعة - بطاقة المكتبة4الوراثة
الأصناف المفتوحة والأصناف الفرعيةتجاوز الأعضاءsuper والمنشئاتالأصناف المجرّدةمراجعة - دليل الموظفينتدرّب بنفسك: Playground لـ Kotlin