חזרה – מעקב אחר הזמנות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Kotlin של Coddy. שיעור 36 מתוך 57.
אתגר
בינוניעקבו אחר הזמנות באמצעות המחלקות המיוחדות של הפרק הזה.
- ה-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())
}
כל השיעורים ביחידה תכנות מונחה עצמים
1מחלקות ואובייקטים
עבודה עם קבציםהגדרת מחלקותבנאים ראשייםבלוקי init ואימות נתוניםבנאים משנייםסיכום – כרטיס ספרייה7מחלקות מיוחדות
מחלקות נתוניםמחלקות Enumהיררכיות אטומותequals, hashCode, toStringחזרה – מעקב אחר הזמנותתרגלו בעצמכם: Kotlin אונליין