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