Menu
CoddyTech

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

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