Menu
Coddy logo textTech

Kitaplar ve Üyeler

Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 50 / 57.

Bu projede Reference Classes kullanarak bir kütüphane sisteminin temelini oluşturursun; çünkü program çalışırken kitaplar ve üyeler değişir: bir kitap ödünç verilir ve iade edilir, bir üyenin ödünç aldığı kitaplar listesi büyür ve küçülür. Bir Library nesnesi, her satırda bir komut alır ve her birine yanıt verir. Beş adım boyunca kitap ve üye eklemeyi, kitap ödünç vermeyi ve geri almayı, katalogda arama yapmayı ve bir rapor yazdırmayı öğrenir.

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

Programda dosya başına bir sınıf bulunur. Book.R ve Member.R iki küçük sınıfı içerir; Library.R ise bunları iki adlandırılmış listede depolayan ve komutları yanıtlayan sınıfı içerir. RC nesneleri referans olduğundan, listede aranan bir kitabı değiştirmek kütüphanedeki kitabı da değiştirir:

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"]]))

Çıktı:

ada TRUE

handle(line) komutu parçalara ayırır ve ilk kelimesi üzerinde switch() kullanarak o komutun yöntemini çağırır. Her yöntem yanıtlarını bir karakter vektörü olarak döndürür; bu nedenle REPORT gibi bir komut birden çok satırla yanıt verebilir. Bir başlık boşluk içerebilir; bu nedenle kimlikten sonraki her şey başlıktır:

p <- strsplit("ADD_BOOK 7 The Hobbit", " ")[[1]]
id <- as.numeric(p[2])
title <- paste(p[-(1:2)], collapse = " ")
cat(id, title, sep = ": ")

Çıktı:

7: The Hobbit
challenge icon

Görev

Kolay

Book sınıfı (id, title, borrower alanları) ve Member sınıfı (name, borrowed alanları) verilmiştir. Library.R içinde Library sınıfının iki yöntemini tamamlayın:

  • ADD_BOOK <id> <title> için add_book(id, title): yeni bir kitabı as.character(id) anahtarı altında saklayın ve added book 1: Dune yanıtını verin; id zaten kullanılıyorsa book 1 exists yanıtını verin.
  • JOIN <name> için join(name): yeni bir üyeyi adı altında saklayın ve welcome ada yanıtını verin; ad zaten mevcutsa ada is already a member yanıtını verin.

Sağlanan kod, her giriş satırını lib$handle(line) işlevine gönderir ve döndürülen her yanıtı kendi satırında yazdırır. Üye adları tek kelimelik küçük harfli adlardır, kitap kimlikleri tam sayılardır ve girdi yalnızca şimdiye kadar açıklanan komutları içerir. Diğer tüm komutlar unknown command yanıtını verir.

Kodunuz Book.R, Member.R ve Library.R dosyalarına yazılmalıdır. main.R sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.

Kendin dene

source("Book.R")
source("Member.R")
source("Library.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
  for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Tabanlı Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi