복습 - 주문 추적기
Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 36번째.
챌린지
중급이 장의 특수 클래스를 사용하여 주문을 추적하세요.
- 열거형
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 플레이그라운드