0Pricing
Kotlin Academy · บทเรียน

ลำดับชั้น Result แบบปิด

ชนิดข้อมูลผลลัพธ์แบบกำหนดเอง

ลำดับชั้น Result แบบปิด เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

ก้าวไปไกลกว่า Result ในตัว

Result ของ Kotlin เก็บข้อยกเว้นไว้เมื่อเกิด failure เท่านั้น แต่บ่อยครั้งคุณต้องการข้อมูลข้อผิดพลาดที่มีชนิดชัดเจนและละเอียดกว่านั้น ลำดับชั้นของ คลาสปิดผนึกช่วยให้คุณจำลองผลลัพธ์ทั้งหมดที่โดเมนของคุณมีได้อย่างตรงจุด

Outcome แบบปิดผนึก

กำหนดชนิดแบบปิดผนึกที่มีคลาสย่อยสำหรับ success และข้อผิดพลาด คอมไพเลอร์จะทราบทุกกรณี ทำให้สามารถจัดการได้อย่างครอบคลุม

sealed class Outcome<out T> {
    data class Ok<T>(val value: T) : Outcome<T>()
    data class Err(val message: String) : Outcome<Nothing>()
}

fun main() {
    val r: Outcome<Int> = Outcome.Ok(5)
    println(r)
}

นิพจน์ when ที่ครอบคลุมทุกกรณี

เนื่องจากชนิดนี้เป็นแบบปิดผนึก การใช้ when กับชนิดดังกล่าวจึงไม่ต้องมี else และคอมไพเลอร์จะบังคับให้จัดการทุกกรณี

sealed class Outcome<out T> {
    data class Ok<T>(val value: T) : Outcome<T>()
    data class Err(val message: String) : Outcome<Nothing>()
}

fun describe(o: Outcome<Int>) = when (o) {
    is Outcome.Ok -> "value " + o.value
    is Outcome.Err -> "error " + o.message
}

fun main() {
    println(describe(Outcome.Ok(9)))
    println(describe(Outcome.Err("boom")))
}

รูปแบบข้อผิดพลาดที่มีชนิดชัดเจน

จำลองประเภท failure ที่แตกต่างกันเป็นคลาสย่อยแยกกัน โดยแต่ละคลาสเก็บข้อมูลที่เกี่ยวข้อง วิธีนี้ดีกว่าการใช้ข้อยกเว้นทึบแสงเพียงรายการเดียว

sealed class Fetch<out T> {
    data class Success<T>(val data: T) : Fetch<T>()
    data class NotFound(val id: Int) : Fetch<Nothing>()
    data class Network(val code: Int) : Fetch<Nothing>()
}

fun main() {
    val r: Fetch<String> = Fetch.NotFound(42)
    println(r)
}

การจัดการแต่ละรูปแบบ

when สามารถตอบสนองต่อข้อผิดพลาดแต่ละชนิดได้โดยเฉพาะ และมีข้อมูลทั้งหมดของแต่ละแขนงให้ใช้งาน

sealed class Fetch<out T> {
    data class Success<T>(val data: T) : Fetch<T>()
    data class NotFound(val id: Int) : Fetch<Nothing>()
    data class Network(val code: Int) : Fetch<Nothing>()
}

fun handle(f: Fetch<String>) = when (f) {
    is Fetch.Success -> "data: " + f.data
    is Fetch.NotFound -> "missing id " + f.id
    is Fetch.Network -> "net error " + f.code
}

fun main() {
    println(handle(Fetch.Network(503)))
}

เคล็ดลับ Nothing

รูปแบบข้อผิดพลาดที่ไม่มีค่าสำเร็จให้เก็บ จะใช้ Outcome<Nothing> เนื่องจาก Nothing เป็นชนิดย่อยของทุกชนิด และชนิดทั่วไปเป็นแบบ out ข้อผิดพลาดจึงเข้ากับ Outcome<T> ใด ๆ ได้

sealed class Res<out T> {
    data class Ok<T>(val v: T) : Res<T>()
    object Empty : Res<Nothing>()
}

fun get(flag: Boolean): Res<String> =
    if (flag) Res.Ok("hi") else Res.Empty

fun main() {
    println(get(false))
}

ใช้ Object กับกรณีไร้สถานะ

หากรูปแบบข้อผิดพลาดไม่มีข้อมูล ให้ประกาศเป็นซิงเกิลตัน object แทนการใช้คลาส

sealed class Login {
    data class Success(val user: String) : Login()
    object WrongPassword : Login()
    object Locked : Login()
}

fun main() {
    val r: Login = Login.WrongPassword
    println(r === Login.WrongPassword)
}

การคืนค่าลำดับชั้น

ฟังก์ชันจะคืนค่าชนิดแบบปิดผนึก ผู้เรียกจึงต้องจัดการผลลัพธ์ทุกแบบ ทำให้ไม่มีเส้นทางข้อผิดพลาดใดถูกลืม

sealed class Parsed {
    data class Num(val value: Int) : Parsed()
    data class Bad(val input: String) : Parsed()
}

fun parse(s: String): Parsed {
    val n = s.toIntOrNull()
    return if (n != null) Parsed.Num(n) else Parsed.Bad(s)
}

fun main() {
    when (val r = parse("x")) {
        is Parsed.Num -> println(r.value)
        is Parsed.Bad -> println("bad: " + r.input)
    }
}

ลำดับชั้นแบบปิดผนึกกับ Result ในตัว

ใช้ Result ในตัวสำหรับการจับข้อผิดพลาดแบบอาศัยข้อยกเว้นอย่างรวดเร็ว ใช้ลำดับชั้นแบบปิดผนึกที่กำหนดเองเมื่อคุณต้องการกรณีข้อผิดพลาดหลายแบบที่มีชนิดชัดเจน พร้อมข้อมูลเฉพาะของโดเมนและการจัดการที่ครอบคลุมทุกกรณี

การออกแบบลำดับชั้น

การออกแบบผลลัพธ์แบบปิดผนึกที่ดี:

  • มีรูปแบบ success หนึ่งแบบที่เก็บข้อมูลผลลัพธ์
  • มีคลาสย่อยหนึ่งคลาสต่อโหมด failure ที่มีความหมาย
  • ใช้ความแปรผัน out T ร่วมกับ Nothing สำหรับกรณีที่มีเฉพาะข้อผิดพลาด

คอมไพเลอร์ในฐานะตาข่ายนิรภัย

ประโยชน์สูงสุดคือ เมื่อคุณเพิ่มรูปแบบใหม่ในภายหลัง when ทุกแห่งที่จัดการกรณีไม่ครบจะกลายเป็นข้อผิดพลาดขณะคอมไพล์ และชี้ให้เห็นทุกจุดที่ต้องจัดการ ข้อผิดพลาดจึงไม่สามารถเล็ดลอดไปโดยไม่มีสัญญาณได้

ตรวจสอบอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับลำดับชั้นของผลลัพธ์แบบปิดผนึก

สรุปทบทวน

คุณได้สร้างลำดับชั้นของผลลัพธ์แบบปิดผนึก:

  • success พร้อมรูปแบบข้อผิดพลาดที่มีชนิดชัดเจน
  • when ที่ครอบคลุมทุกกรณีโดยไม่ต้องมี else
  • out T และ Nothing สำหรับกรณีที่มีเฉพาะข้อผิดพลาด
  • คอมไพเลอร์บังคับให้จัดการรูปแบบใหม่

ถัดไป: การจัดการข้อผิดพลาดเชิงฟังก์ชันด้วย map และ recover

คำถามที่พบบ่อย

บทเรียน “ลำดับชั้น Result แบบปิด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ลำดับชั้น Result แบบปิด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ลำดับชั้น Result แบบปิด”

ชนิดข้อมูลผลลัพธ์แบบกำหนดเอง คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ลำดับชั้น Result แบบปิด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชนิดข้อมูล Result
  2. runCatching
  3. ลำดับชั้น Result แบบปิด
  4. การจัดการข้อผิดพลาดเชิงฟังก์ชัน
← กลับไปที่ Kotlin Academy