Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - متتبّع الطلبات

جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 36 من 57.

challenge icon

التحدي

متوسط

تتبّع الطلبات باستخدام الأصناف الخاصة بهذا الفصل.

  • يحتوي التعداد Status على الثوابت NEW وPAID وSHIPPED وDELIVERED وCANCELLED، ولكل منها label (new وpaid و...)، وcanMoveTo(next): يمكن أن تصبح new هي paid أو cancelled، ويمكن أن تصبح paid هي shipped أو cancelled، ويمكن أن تصبح shipped هي delivered، ولا يُسمح بأي انتقال آخر.
  • Order(id, item, status) هو صنف بيانات تبدأ حالته كـ NEW.
  • تحتوي الواجهة المختومة Outcome على الحالتين Updated(order) وRejected(id, reason).
  • تنشئ Tracker.place(item) طلبًا بالمعرّف التالي (1، 2، ...) وتعيده. تُعيد move(id, target) القيمة Rejected مع no such order أو cannot go from new to delivered، أو تخزّن نسخةً مُعدّلة من الطلب وتُعيد Updated. تُعيد summary() عدد الطلبات لكل حالة وفق ترتيب التعداد، مع استبعاد الحالات التي لا تحتوي على أي طلب: paid 1, cancelled 1، أو no orders.
  • تستخدم describe(outcome) تعبير when شاملًا وتُعيد نص الطلب المُحدَّث أو rejected 2: no such order.

يقرأ الكود المزوَّد الأوامر place tea أو <status> <id> مثل paid 1، ويطبع كل طلب موضوع، وكل نتيجة موصوفة، ثم الملخص في النهاية.

ضع الكود الخاص بك في Status.kt وOrder.kt وOutcome.kt وUpdated.kt وRejected.kt وTracker.kt وFunctions.kt. يحتوي Main.kt على كود الإدخال/الإخراج المزوَّد ولا يمكن تعديله.

جرّب بنفسك

fun main() {
    // كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
    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())
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Kotlin