Ô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.
Thử thách
Trung bìnhTheo dõi đơn hàng bằng các lớp đặc biệt trong chương này.
- Enum
Statuscó các hằng sốNEW,PAID,SHIPPED,DELIVEREDvàCANCELLED, mỗi hằng số có mộtlabel(new,paid, ...), cùng vớicanMoveTo(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
Outcomecó các trường hợpUpdated(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ềRejectedcùng vớino such orderhoặccannot 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ặcno orders.describe(outcome)dùngwhenbao quát mọi trường hợp và trả về nội dung của đơn hàng đã cập nhật hoặcrejected 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
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ên7Các lớp đặc biệt
Lớp dữ liệuLớp enumHệ phân cấp sealedequals, hashCode, toStringÔn tập: Theo dõi đơn hàng2Thuộ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