تسلسلات Result المختومة
أنواع Result مخصصة
تسلسلات Result المختومة درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ما بعد Result المدمج
يحمل Result المدمج في Kotlin استثناءً فقط عند الفشل. وغالبًا ما تحتاج إلى معلومات أخطاء أغنى ومحددة النوع. يتيح لك تسلسل هرمي من الفئات المختومة نمذجة النتائج التي يمكن أن يملكها نطاقك بالضبط.
نتيجة مختومة
عرّف نوعًا مختومًا مع فئات فرعية للنجاح والخطأ. يعرف المصرّف جميع الحالات، مما يتيح معالجة شاملة لها.
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")))
}تنويعات أخطاء محددة النوع
مثّل أنواع الفشل المميزة كفئات فرعية منفصلة، تحمل كل منها البيانات ذات الصلة. وهذا أفضل من استثناء واحد مبهم.
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 المدمج للالتقاط السريع القائم على الاستثناءات. واستخدم تسلسلًا هرميًا مختومًا مخصصًا عندما تحتاج إلى حالات أخطاء متعددة محددة النوع مع بيانات خاصة بالنطاق ومعالجة شاملة.
تصميم التسلسل الهرمي
يتضمن التصميم الجيد لنتيجة مختومة:
- تنويع نجاح واحد يحمل البيانات
- فئة فرعية واحدة لكل نمط فشل مهم
- تغاير
out TمعNothingللحالات التي لا تحمل إلا الخطأ
المصرّف كشبكة أمان
أكبر فائدة هي أنه عند إضافة تنويع جديد لاحقًا، يتحول كل when غير الشامل إلى خطأ في وقت الترجمة، ويوجهك إلى كل موضع يجب أن يعالجه. فلا يمكن للأخطاء أن تمر بصمت.
تحقق سريع
اختبر فهمك للتسلسلات الهرمية المختومة للنتائج.
مراجعة
أنشأت تسلسلات هرمية مختومة للنتائج:
- نجاح بالإضافة إلى تنويعات أخطاء محددة النوع
whenشامل من دونelseout TوNothingللحالات التي لا تحمل إلا الخطأ- معالجة التنويعات الجديدة التي يفرضها المصرّف
التالي: معالجة الأخطاء الوظيفية باستخدام map وrecover.
الأسئلة الشائعة
هل درس «تسلسلات Result المختومة» مجاني؟
نعم — نص درس «تسلسلات Result المختومة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «تسلسلات Result المختومة»؟
أنواع Result مخصصة تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «تسلسلات Result المختومة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نوع Result
- runCatching
- تسلسلات Result المختومة
- معالجة الأخطاء الوظيفية