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