Menu
CoddyTech

Rekap: Pelacak Pesanan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 36 dari 57.

challenge icon

Tantangan

Sedang

Lacak pesanan dengan class khusus dalam bab ini.

  • enum Status memiliki konstanta NEW, PAID, SHIPPED, DELIVERED dan CANCELLED, masing-masing dengan label (new, paid, ...), serta canMoveTo(next): status new dapat berubah menjadi paid atau cancelled, status paid dapat berubah menjadi shipped atau cancelled, status shipped dapat berubah menjadi delivered, dan perubahan lainnya tidak diizinkan.
  • Order(id, item, status) adalah data class dengan status awal NEW.
  • sealed interface Outcome memiliki kasus Updated(order) dan Rejected(id, reason).
  • Tracker.place(item) membuat pesanan dengan id berikutnya (1, 2, ...) dan mengembalikannya. move(id, target) mengembalikan Rejected dengan no such order atau cannot go from new to delivered, atau menyimpan salinan pesanan yang telah diubah dan mengembalikan Updated. summary() mengembalikan jumlah pesanan untuk setiap status sesuai urutan enum, dengan mengecualikan status yang jumlahnya nol: paid 1, cancelled 1, atau no orders.
  • describe(outcome) menggunakan when yang mencakup semua kemungkinan dan mengembalikan teks pesanan yang diperbarui atau rejected 2: no such order.

Code yang disediakan membaca perintah place tea atau <status> <id>, seperti paid 1, mencetak setiap pesanan yang dibuat, setiap hasil yang dijelaskan, lalu ringkasan.

Tulis kodemu di Status.kt, Order.kt, Outcome.kt, Updated.kt, Rejected.kt, Tracker.kt dan Functions.kt. Main.kt berisi code input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

fun main() {
    // Kode input/output yang disediakan: biarkan apa adanya
    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())
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Kotlin