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