Menu
CoddyTech

Ôn tập: Theo dõi đơn hàng

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 36 trên 57.

challenge icon

Thử thách

Trung bình

Theo dõi đơn hàng bằng các lớp đặc biệt trong chương này.

  • Enum Status có các hằng số NEW, PAID, SHIPPED, DELIVERED và CANCELLED, mỗi hằng số có một label (new, paid, ...), cùng với canMoveTo(next): trạng thái new có thể chuyển thành paid hoặc cancelled, trạng thái paid có thể chuyển thành shipped hoặc cancelled, trạng thái shipped có thể chuyển thành delivered, và không cho phép chuyển đổi nào khác.
  • Order(id, item, status) là một lớp dữ liệu có trạng thái ban đầu là NEW.
  • Giao diện sealed Outcome có các trường hợp Updated(order) và Rejected(id, reason).
  • Tracker.place(item) tạo một đơn hàng với id tiếp theo (1, 2, ...) rồi trả về đơn hàng đó. move(id, target) trả về Rejected cùng với no such order hoặc cannot go from new to delivered, hoặc lưu một bản sao đã thay đổi của đơn hàng rồi trả về Updated. summary() trả về số đơn hàng theo từng trạng thái, theo thứ tự trong enum, bỏ qua các trạng thái không có đơn hàng nào: paid 1, cancelled 1, hoặc no orders.
  • describe(outcome) dùng when bao quát mọi trường hợp và trả về nội dung của đơn hàng đã cập nhật hoặc rejected 2: no such order.

Code được cung cấp đọc các lệnh place tea hoặc <status> <id>, chẳng hạn paid 1, in ra từng đơn hàng được tạo, kết quả được mô tả và cuối cùng là bản tóm tắt.

Code của bạn nằm trong các tệp Status.kt, Order.kt, Outcome.kt, Updated.kt, Rejected.kt, Tracker.kt và Functions.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 tracker = Tracker()
    for (cmd in input) {
        val p = cmd.split(" ")
        if (p[0] == "place") {
            println(tracker.place(p[1]))
        } else {
            val target = Status.entries.find { it.label == p[0] }
            if (target == null) println("unknown status ${p[0]}")
            else println(describe(tracker.move(p[1].toInt(), target)))
        }
    }
    println(tracker.summary())
}

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

Tự luyện tập: Playground Kotlin