Menu
CoddyTech

Sách và thành viên

Thuộc phần Lập trình hướng đối tượng trong hành trình R của Coddy. Bài học 50 trên 57.

Trong dự án này, bạn sẽ xây dựng phần cốt lõi của một hệ thống thư viện bằng Reference Classes, vì sách và thành viên thay đổi trong khi chương trình chạy: sách được cho mượn rồi trả lại, danh sách sách mượn của thành viên dài ra rồi ngắn đi. Một đối tượng Library nhận lệnh, mỗi dòng một lệnh, rồi phản hồi từng lệnh. Qua năm bước, bạn sẽ học cách thêm sách và thành viên, cho mượn và nhận lại sách, tìm kiếm danh mục rồi in báo cáo.

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

Chương trình có một lớp trong mỗi tệp. Book.R và Member.R chứa hai lớp nhỏ, còn Library.R chứa lớp lưu chúng trong hai danh sách có tên và xử lý các lệnh. Vì đối tượng RC là tham chiếu, khi thay đổi một quyển sách được tìm trong danh sách, quyển sách đó cũng thay đổi trong thư viện:

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

Đầu ra:

ada TRUE

handle(line) tách lệnh rồi dùng switch() với từ đầu tiên để gọi phương thức tương ứng với lệnh đó. Mỗi phương thức trả về các câu trả lời dưới dạng một vector ký tự, nên một lệnh như REPORT có thể trả lời bằng nhiều dòng. Tiêu đề có thể chứa dấu cách, nên tiêu đề là toàn bộ phần đứng sau id:

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

Đầu ra:

7: The Hobbit
challenge icon

Thử thách

Dễ

Các lớp (class) Book (có các thuộc tính id, title, borrower) và Member (có các thuộc tính name, borrowed) đã được cung cấp. Hoàn thành hai phương thức (method) của Library trong Library.R:

  • add_book(id, title) cho lệnh ADD_BOOK <id> <title>: lưu sách mới bằng khóa as.character(id) và trả lời added book 1: Dune; nếu id đã được dùng, trả lời book 1 exists.
  • join(name) cho lệnh JOIN <name>: lưu thành viên mới bằng tên và trả lời welcome ada; nếu tên đã tồn tại, trả lời ada is already a member.

Code được cung cấp gửi từng dòng đầu vào đến lib$handle(line) và in mỗi câu trả lời nhận được trên một dòng riêng. Tên thành viên là các từ viết thường đơn lẻ, mã sách là số nguyên và đầu vào chỉ chứa những lệnh đã mô tả đến đây. Lệnh khác sẽ trả lời unknown command.

Code của bạn nằm trong Book.R, Member.R và Library.R. main.R chứa code đầu vào và đầu ra đã được cung cấp, bạn không thể chỉnh sửa tệp này.

Tự làm thử

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

# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
  for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch R online