الكتب والأعضاء
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 50 من 57.
في هذا المشروع، تبني نواة نظام مكتبة باستخدام الأصناف المرجعية، لأن الكتب والأعضاء يتغيرون أثناء تشغيل البرنامج: يُعار الكتاب ويُعاد، وتنمو قائمة إعارات العضو وتتقلص. يتلقى كائن Library الأوامر، أمرًا واحدًا في كل سطر، ويرد على كل منها. وخلال خمس خطوات، يتعلم إضافة الكتب والأعضاء، وإعارة الكتب واستعادتها، والبحث في الفهرس وطباعة تقرير.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTيحتوي البرنامج على صنف واحد لكل ملف. يحتوي Book.R وMember.R على الصنفين الصغيرين، بينما يحتوي Library.R على الصنف الذي يخزّنهما في قائمتين مسمّاتين ويجيب عن الأوامر. وبما أن كائنات RC هي مراجع، فإن تغيير كتاب تم البحث عنه في القائمة يغيّر الكتاب في المكتبة:
Book <- setRefClass("Book", fields = list(id = "numeric", title = "character", borrower = "character"))
books <- list()
books[["7"]] <- Book$new(id = 7, title = "Dune")
b <- books[["7"]]
b$borrower <- "ada"
cat(books[["7"]]$borrower, is.null(books[["9"]]))الناتج:
ada TRUEhandle(line) يجزّئ الأمر ويستخدم switch() على كلمته الأولى لاستدعاء الطريقة الخاصة بذلك الأمر. تُرجع كل طريقة ردودها على شكل متجه محارف، لذا يمكن لأمر مثل REPORT أن يرد بعدة أسطر. يمكن أن يحتوي العنوان على مسافات، لذلك فهو كل ما يأتي بعد المعرّف:
p <- strsplit("ADD_BOOK 7 The Hobbit", " ")[[1]]
id <- as.numeric(p[2])
title <- paste(p[-(1:2)], collapse = " ")
cat(id, title, sep = ": ")الناتج:
7: The Hobbitالتحدي
سهلالفئتان Book (الحقول id وtitle وborrower) وMember (الحقول name وborrowed) مُعطاتان. أكمل طريقتين من Library في Library.R:
add_book(id, title)من أجلADD_BOOK <id> <title>: خزّن كتابًا جديدًا تحتas.character(id)وأعدadded book 1: Dune؛ وعندما يكون المعرّف مستخدمًا، أعدbook 1 exists.join(name)من أجلJOIN <name>: خزّن عضوًا جديدًا تحت الاسم وأعدwelcome ada؛ وعندما يكون الاسم موجودًا، أعدada is already a member.
يرسل الكود المُزوَّد كل سطر إدخال إلى lib$handle(line) ويطبع كل رد مُعاد في سطر مستقل. أسماء الأعضاء كلمات مفردة صغيرة الأحرف، ومعرّفات الكتب أعداد صحيحة، ولا يحتوي الإدخال إلا على الأوامر الموضحة حتى الآن. أي أمر آخر يُرجع unknown command.
يجب وضع الكود في Book.R وMember.R وLibrary.R. يحتوي main.R على كود الإدخال/الإخراج المُزوَّد ولا يمكن تعديله.
جرّب بنفسك
source("Book.R")
source("Member.R")
source("Library.R")
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت