Menu
Coddy logo textTech

복습 - 주문 추적기

Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 36번째.

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)은 다음 ID(1, 2, ...)로 주문을 생성하고 반환합니다. move(id, target)은 no such order 또는 cannot go from new to delivered라는 내용의 Rejected를 반환하거나, 변경된 주문의 복사본을 저장하고 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())
}

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Kotlin 플레이그라운드