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 Kotlin của Coddy. Bài học 50 trên 57.
Trong dự án này, bạn xây dựng phần cốt lõi của hệ thống thư viện. Lớp Library nhận các lệnh, mỗi lệnh trên một dòng, rồi phản hồi từng lệnh. Qua năm bước, hệ thống 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
REPORTMô hình dữ liệu sử dụng những gì phần này đã dạy. Book và Member nằm trong các tệp riêng. Bạn có thể đọc borrower của một cuốn sách ở mọi nơi, nhưng chỉ có thể thay đổi thuộc tính này thông qua lendTo và giveBack. Một thành viên cung cấp các mã định danh của những khoản mượn dưới dạng List chỉ đọc. Thư viện lưu cả hai trong các bản đồ riêng tư, vì vậy chỉ các phương thức của thư viện mới có thể thay đổi chúng:
class Book(val id: Int, val title: String) {
var borrower: String? = null
private set
val isAvailable: Boolean
get() = borrower == null
fun lendTo(name: String) { borrower = name }
}Bên trong main:
val books = mutableMapOf<Int, Book>()
books[1] = Book(1, "Dune")
books.getValue(1).lendTo("ada")
println("${books.getValue(1).isAvailable} ${books.getValue(1).borrower}")Đầu ra:
false adahandle(line) tách lệnh và dùng when với từ đầu tiên. Mỗi nhánh trả về các câu trả lời dưới dạng List<String>, nên một lệnh như REPORT có thể trả lời bằng nhiều dòng, còn return sớm sẽ trả về lời từ chối. Tên sách có thể chứa khoảng trắng, vì vậy tên sách là toàn bộ phần sau id:
Bên trong main:
val p = "ADD_BOOK 7 The Hobbit".split(" ")
val id = p[1].toInt()
val title = p.drop(2).joinToString(" ")
println("$id: $title")Đầu ra:
7: The HobbitThử thách
DễHoàn thiện Library.handle(line) cho hai lệnh đầu tiên:
ADD_BOOK <id> <title>: lưu một cuốn sách mới đang có sẵn và phản hồiadded book 1: Dune; nếu id đã được dùng, phản hồibook 1 exists.JOIN <name>: thêm một thành viên và phản hồiwelcome ada; nếu tên đã tồn tại, phản hồiada is already a member.
Code được cung cấp chuyển từng dòng đầu vào đến library.handle(line) và in mỗi phản hồi trả về trên một dòng riêng. Tên thành viên là các từ viết thường đơn, id sách là số nguyên và đầu vào chỉ chứa các lệnh đã mô tả. Lệnh khác sẽ phản hồi unknown command.
Code của bạn nằm trong Book.kt, Member.kt và Library.kt. Main.kt chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
fun main() {
// Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
val input = generateSequence(::readLine).toList()
val library = Library()
for (line in input) {
for (reply in library.handle(line)) println(reply)
}
}
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
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpHàm khởi tạo chínhKhối init và kiểm tra tính hợp lệHàm khởi tạo phụÔn tập: thẻ thư viện4Kế thừa
Lớp mở và lớp conGhi đè thành viênsuper và hàm khởi tạoLớp trừu tượngÔn tập: Danh bạ nhân viên2Thuộc tính và tính đóng gói
Trình truy cập tùy chỉnhBộ sửa đổi phạm vi truy cậpSetter riêng tưlazy và lateinitÔn tập: tài khoản ngân hàng5Giao diện
Khai báo giao diệnPhương thức mặc địnhNhiều giao diệnGiao diện như kiểu dữ liệuÔn tập: Phương thức thanh toánTự luyện tập: Playground Kotlin