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 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
REPORT

Mô 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 ada

handle(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 Hobbit
challenge icon

Thử 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ồi added book 1: Dune; nếu id đã được dùng, phản hồi book 1 exists.
  • JOIN <name>: thêm một thành viên và phản hồi welcome ada; nếu tên đã tồn tại, phản hồi ada 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)
    }
}
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: Playground Kotlin