الكتب والأعضاء
جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 50 من 57.
في هذا المشروع، ستبني نواة نظام مكتبة. تتلقى الفئة Library الأوامر، أمرًا واحدًا في كل سطر، وترد على كل منها. خلال خمس خطوات، ستتعلّم إضافة الكتب والأعضاء، وإعارة الكتب واستعادتها، والبحث في الفهرس وطباعة تقرير.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTيستخدم نموذج البيانات أدوات هذا القسم. Book هو بنية: قيمة يتغير فيها borrower. أما Member فهو فئة، لأن المكتبة وقائمة إعارات العضو تشير إلى الشخص نفسه. تحتفظ المكتبة بكليهما في قاموسين خاصين، لذا لا يمكن تغييرهما إلا من خلال أساليبها:
struct Book {
let id: Int
let title: String
var borrower: String? = nil
var isAvailable: Bool { borrower == nil }
}
var books: [Int: Book] = [:]
books[1] = Book(id: 1, title: "Dune")
books[1]!.borrower = "ada"
print(books[1]!.isAvailable)الناتج:
falseتقوم handle(_:) بتقسيم الأمر والتبديل وفقًا لكلمته الأولى. يُرجع كل فرع ردوده كمصفوفة، لذا يمكن لأمر مثل REPORT أن يرد بعدة أسطر. يمكن أن يحتوي عنوان الكتاب على مسافات، لذلك فهو كل ما يأتي بعد المعرّف:
let p = "ADD_BOOK 7 The Hobbit".split(separator: " ").map(String.init)
let id = Int(p[1])!
let title = p.dropFirst(2).joined(separator: " ")
print("\(id): \(title)")الناتج:
7: The Hobbitالتحدي
سهلأكمل Library.handle(_:) للأمرين الأولين:
ADD_BOOK <id> <title>: خزّن كتابًا جديدًا متاحًا وأجب بـadded book 1: Dune؛ وعندما يكون المعرّف مستخدمًا، أجب بـbook 1 exists.JOIN <name>: أضف عضوًا وأجب بـwelcome ada؛ وعندما يكون الاسم موجودًا، أجب بـada is already a member.
يمرّر الكود المزوّد كل سطر إدخال إلى library.handle(_:) ويطبع كل رد مُعاد في سطر مستقل. أسماء الأعضاء كلمات مفردة بأحرف لاتينية صغيرة، ومعرّفات الكتب أعداد صحيحة، والإدخال يحتوي فقط على الأوامر الموضحة حتى الآن. أي أمر آخر يُرجع unknown command.
ضع كودك في Book.swift وMember.swift وLibrary.swift. يحتوي main.swift على كود الإدخال/الإخراج المزوّد ولا يمكن تعديله.
جرّب بنفسك
// كود الإدخال/الإخراج المُزوَّد: اتركه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
let library = Library()
for line in input {
for reply in library.handle(line) { print(reply) }
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكالتدرّب بنفسك: Playground لـ Swift