Menu
Coddy logo textTech

復習 - 注文トラッカー

CoddyのKotlinジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 36/57。

challenge icon

チャレンジ

中級

この章の特殊なクラスを使って注文を追跡します。

  • 列挙型 Status には、label(new、paid、...)を持つ定数 NEW、PAID、SHIPPED、DELIVERED、CANCELLED があり、canMoveTo(next) によって、new は paid または cancelled に、paid は shipped または cancelled に、shipped は delivered になることができ、それ以外はすべて許可されません。
  • Order(id, item, status) はデータクラスで、status は NEW として開始します。
  • sealed interface Outcome には、Updated(order) と Rejected(id, reason) のケースがあります。
  • Tracker.place(item) は次の id(1、2、...)を持つ注文を作成して返します。move(id, target) は、no such order または cannot go from new to delivered を伴う Rejected を返すか、注文の変更されたコピーを保存して Updated を返します。summary() は、列挙型の順序に従ってステータスごとの注文数を返し、件数が0のステータスは省略します。例: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プレイグラウンド