Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الكتب والأعضاء

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

handle(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
challenge icon

التحدي

سهل

الفئتان 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 = "")
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم R عبر الإنترنت