Menu
Coddy logo textTech

חזרה – מעקב אחר הזמנות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Kotlin של Coddy. שיעור 36 מתוך 57.

challenge icon

אתגר

בינוני

עקבו אחר הזמנות באמצעות המחלקות המיוחדות של הפרק הזה.

  • ה-enum 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() מחזירה את מספר ההזמנות בכל סטטוס לפי סדר ה-enum, ומשמיטה סטטוסים שאין בהם הזמנות: 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())
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Kotlin אונליין