تداخل التسلسلات الهرمية المختومة ودمجها
أنشئ آلات حالات معقدة من خلال تداخل الأنواع المختومة.
تداخل التسلسلات الهرمية المختومة ودمجها درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
تركيب أشجار الحالة
غالبًا ما تحتوي الحالة في العالم الحقيقي على أبعاد متعددة. اجعلوا الأنواع sealed متداخلة أو ادمجوا تسلسلات هرمية منفصلة لنمذجة المجالات المعقدة بطريقة واضحة.
Sealed Class متداخلة
صرّحوا بالأنواع الفرعية sealed داخل نوع sealed خارجي. وسيظل المصرّف يفرض الشمول عبر الشجرة بأكملها.
sealed class UiState {
object Loading : UiState()
sealed class Loaded : UiState() {
data class Success(val items: List<String>) : Loaded()
data class Empty(val message: String) : Loaded()
}
data class Error(val msg: String) : UiState()
}
fun render(s: UiState) = when (s) {
UiState.Loading -> "loading"
is UiState.Loaded.Success -> "${s.items.size} items"
is UiState.Loaded.Empty -> "empty: ${s.message}"
is UiState.Error -> "err: ${s.msg}"
}
fun main() {
println(render(UiState.Loaded.Success(listOf("a", "b"))))
}الواجهات sealed للخلائط
استخدموا الواجهات sealed عندما تكون للحالة جوانب متعددة مستقلة — بحيث يمثّل كل جانب واجهة مختلفة.
sealed interface Authenticated
data class User(val id: Int) : Authenticated
object Guest
sealed interface Permission
object Read : Permission
object Write : Permission
fun describe(a: Authenticated, p: Permission): String = when {
a is User && p is Write -> "user ${a.id} can write"
a is User -> "user ${a.id} can read"
else -> "?"
}
fun main() {
println(describe(User(1), Write))
}دمج التسلسلات الهرمية
مرّروا قيمتين sealed وبدّلوا بناءً على تركيبهما — استخدموا when مع شروط الحراسة.
sealed class Theme { object Light : Theme(); object Dark : Theme() }
sealed class Lang { object En : Lang(); object Tr : Lang() }
fun greet(theme: Theme, lang: Lang) = when {
theme is Theme.Dark && lang is Lang.Tr -> "Karanlik Merhaba"
theme is Theme.Light && lang is Lang.Tr -> "Aydinlik Merhaba"
theme is Theme.Dark -> "Dark Hello"
theme is Theme.Light -> "Light Hello"
else -> "?"
}
fun main() {
println(greet(Theme.Dark, Lang.Tr))
}آلة حالات ذات متغيرات متداخلة
نمذجوا سير العمل متعدد الخطوات باستخدام أنواع sealed متداخلة، بحيث تكون لكل خطوة متغيراتها الخاصة.
sealed class Checkout {
object Start : Checkout()
sealed class Payment : Checkout() {
object Pending : Payment()
data class Failed(val reason: String) : Payment()
object Captured : Payment()
}
object Shipped : Checkout()
object Delivered : Checkout()
}
fun describe(c: Checkout) = when (c) {
Checkout.Start -> "starting"
Checkout.Payment.Pending -> "awaiting payment"
is Checkout.Payment.Failed -> "payment failed: ${c.reason}"
Checkout.Payment.Captured -> "paid"
Checkout.Shipped -> "shipped"
Checkout.Delivered -> "delivered"
}
fun main() {
println(describe(Checkout.Payment.Failed("card declined")))
}إعادة استخدام التسلسلات الهرمية sealed عبر الوحدات
من الأفضل تعريف الأنواع sealed لكل وحدة. وللتركيب عبر الوحدات، اكشفوا عن sealed interface كي تتمكن كل وحدة من إضافة تطبيقاتها الخاصة.
sealed interface Notification
data class Email(val to: String) : Notification
data class Sms(val phone: String) : Notification
fun send(n: Notification) = when (n) {
is Email -> "sending email to ${n.to}"
is Sms -> "texting ${n.phone}"
}
fun main() {
println(send(Email("a@example.com")))
}الخصائص الأساسية المشتركة
يمكن للفئات sealed التصريح بخصائص مشتركة، وترثها جميع الأنواع الفرعية. وهذا يحافظ على جفاف الحالة والبيانات الوصفية.
sealed class HttpResponse(val code: Int) {
class Ok(val body: String) : HttpResponse(200)
class NotFound(val path: String) : HttpResponse(404)
class ServerError(val cause: String) : HttpResponse(500)
}
fun describe(r: HttpResponse) = "[${r.code}] " + when (r) {
is HttpResponse.Ok -> r.body
is HttpResponse.NotFound -> "not found: ${r.path}"
is HttpResponse.ServerError -> "fail: ${r.cause}"
}
fun main() {
println(describe(HttpResponse.Ok("hello")))
}نمذجة الأشجار التكرارية
تصف الأنواع sealed البنى التكرارية، مثل أشجار التعبيرات، بصورة طبيعية.
sealed class Expr {
data class Num(val value: Int) : Expr()
data class Add(val left: Expr, val right: Expr) : Expr()
data class Mul(val left: Expr, val right: Expr) : Expr()
}
fun eval(e: Expr): Int = when (e) {
is Expr.Num -> e.value
is Expr.Add -> eval(e.left) + eval(e.right)
is Expr.Mul -> eval(e.left) * eval(e.right)
}
fun main() {
val expr = Expr.Add(Expr.Num(3), Expr.Mul(Expr.Num(4), Expr.Num(5)))
println(eval(expr)) // 23
}الدمج مع الأنواع العامة
يمكن أن تكون الأنواع sealed عامة، مما يتيح أغلفة نتائج مكتوبة النوع مثل Result<T>.
sealed class ApiResult<out T> {
data class Success<T>(val data: T) : ApiResult<T>()
data class Failure(val message: String) : ApiResult<Nothing>()
}
fun handle(r: ApiResult<String>) = when (r) {
is ApiResult.Success -> "got ${r.data}"
is ApiResult.Failure -> "err: ${r.message}"
}
fun main() {
println(handle(ApiResult.Success("hi")))
println(handle(ApiResult.Failure("nope")))
}نمط مضاد: التداخل العميق جدًا
يخفي التداخل العميق المقصود. إذا كانت شجرة sealed أعمق من مستويين، ففكّروا في تسطيحها أو استخراج الأشجار الفرعية إلى ملفاتها الخاصة.
sealed class Top {
sealed class Mid : Top() {
sealed class Deep : Mid() {
object Leaf : Deep()
}
}
}
fun main() {
val l = Top.Mid.Deep.Leaf
println(l::class.simpleName)
}الدمج عبر التركيب
عندما يكون بُعدا الحالة مستقلين، فضّلوا التركيب (أي data class تغلّف قيمتين sealed) على التسلسلات الهرمية المتداخلة بعمق.
sealed class Loading { object Active : Loading(); object Idle : Loading() }
sealed class Auth { data class Signed(val id: Int) : Auth(); object Anon : Auth() }
data class AppState(val loading: Loading, val auth: Auth)
fun main() {
val s = AppState(Loading.Active, Auth.Signed(1))
println(s)
}تحقق سريع
ما النهج الموصى به عندما يكون بُعدا الحالة مستقلين؟
مراجعة
اجعلوا الأنواع sealed متداخلة لتمثيل الحالة على شكل شجرة، وادمجوا التسلسلات الهرمية sealed المستقلة باستخدام التركيب (أي data class تغليف). أضيفوا الخصائص المشتركة إلى أساس sealed، واستخدموا الأنواع العامة للنتائج المكتوبة النوع، ونمذجوا البنى التكرارية بصورة طبيعية. حافظوا على ضحالة التداخل.
الأسئلة الشائعة
هل درس «تداخل التسلسلات الهرمية المختومة ودمجها» مجاني؟
نعم — نص درس «تداخل التسلسلات الهرمية المختومة ودمجها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «تداخل التسلسلات الهرمية المختومة ودمجها»؟
أنشئ آلات حالات معقدة من خلال تداخل الأنواع المختومة. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تداخل التسلسلات الهرمية المختومة ودمجها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- sealed class مقابل sealed interface: متى تستخدم كلًّا منهما
- when شامل مع التسلسلات الهرمية المختومة
- نمذجة حالة واجهة المستخدم باستخدام Sealed Classes
- تداخل التسلسلات الهرمية المختومة ودمجها