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
REPORTChươ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 TRUEhandle(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 HobbitThử 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ệnhADD_BOOK <id> <title>: lưu sách mới bằng khóaas.character(id)và trả lờiadded book 1: Dune; nếu id đã được dùng, trả lờibook 1 exists.join(name)cho lệnhJOIN <name>: lưu thành viên mới bằng tên và trả lờiwelcome ada; nếu tên đã tồn tại, trả lờiada 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 = "")
}
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
1Kiến thức cơ bản về S3
Làm việc với tệpDanh sách với một lớpHàm khởi tạoPhương thức in ra và định dạngTrình xác thực và hàm hỗ trợÔn tập: nhiệt độ4Tính đóng gói trong R
Closure dưới dạng đối tượngMôi trường dưới dạng đối tượngHàm truy cậpBảo vệ trạng tháiÔn tập: đồng hồ tính phí đỗ xe2S3, hàm generic và phương thức
Hàm generic và UseMethodPhương thức mặc địnhPhương thức cho hàm generic cơ sởCơ bản về NextMethodÔn tập: diện tích hình5Các lớp S4
Định nghĩa lớp S4Slot và quyền truy cậpKiểm tra tính hợp lệPhương thức showÔn tập: Danh mục sản phẩmTự luyện tập: Trình biên dịch R online