復習 - 注文トラッカー
CoddyのKotlinジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 36/57。
チャレンジ
中級この章の特殊なクラスを使って注文を追跡します。
- 列挙型
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プレイグラウンド