0Pricing
Kotlin Academy · Ders

Sealed Hiyerarşileri İç İçe Yerleştirme ve Birleştirme

Sealed türleri iç içe yerleştirerek karmaşık durum makineleri oluşturun.

Sealed Hiyerarşileri İç İçe Yerleştirme ve Birleştirme, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

Durum Ağaçlarını Birleştirme

Gerçek dünyadaki durumların çoğu zaman birden çok boyutu vardır. Karmaşık alanları temiz bir şekilde modellemek için mühürlü türleri iç içe yerleştirin veya ayrı hiyerarşileri birleştirin.

İç İçe Mühürlü Sınıf

Alt mühürlü türleri dış mühürlü türün içinde tanımlayın. Derleyici, tüm ağaç boyunca tüm olasılıkların kapsanmasını yine zorunlu kılar.

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"))))
}

Karışımlar için Mühürlü Arayüzler

Bir durumun birden çok bağımsız yönü olduğunda mühürlü arayüzleri kullanın — her yön farklı bir arayüzdür.

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))
}

Hiyerarşileri Birleştirme

İki mühürlü değer aktarın ve bunların birleşimine göre seçim yapın — korumalı when kullanın.

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))
}

İç İçe Varyantlarla Durum Makinesi

Çok adımlı iş akışlarını iç içe mühürlü türler olarak modelleyin — her adımın kendi varyantları vardır.

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")))
}

Mühürlü Hiyerarşileri Modüller Arasında Yeniden Kullanma

Mühürlü türler en iyi modül bazında tanımlanır. Modüller arası birleştirme için mühürlü bir arayüz sunun; böylece her modül kendi uygulamalarını ekleyebilir.

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")))
}

Ortak Temel Özellikler

Mühürlü sınıflar ortak özellikleri tanımlayabilir — tüm alt türler bunları devralır. Durumu ve üst verileri DRY tutar.

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")))
}

Özyinelemeli Ağaçları Modelleme

Mühürlü türler, ifade ağaçları gibi özyinelemeli yapıları doğal biçimde tanımlar.

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
}

Genel Türlerle Birleştirme

Mühürlü türler genel olabilir ve Result<T> gibi türü belirlenmiş sonuç kapsayıcılarını mümkün kılar.

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")))
}

Karşıt Kalıp: Fazla Derin İç İçe Yerleştirme

Derin iç içe yerleştirme amacı gizler. Mühürlü bir ağaç iki düzeyden daha derinse düzleştirmeyi veya alt ağaçları kendi dosyalarına çıkarmayı düşünün.

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)
}

Bileşim Yoluyla Birleştirme

İki durum boyutu bağımsız olduğunda, derin iç içe hiyerarşiler yerine bileşimi (iki mühürlü değeri saran bir veri sınıfını) tercih edin.

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)
}

Kısa Kontrol

İki durum boyutu bağımsız olduğunda önerilen yaklaşım nedir?

Özet

Ağaç biçimli durumlar için mühürlü türleri iç içe yerleştirin; bağımsız mühürlü hiyerarşileri bileşimle (sarmalayıcı veri sınıfıyla) birleştirin. Ortak özellikleri mühürlü bir temele ekleyin, türü belirlenmiş sonuçlar için genelleri kullanın ve özyinelemeli yapıları doğal biçimde modelleyin. İç içe yerleştirmeyi sığ tutun.

Sıkça Sorulan Sorular

“Sealed Hiyerarşileri İç İçe Yerleştirme ve Birleştirme” dersi ücretsiz mi?

Evet — “Sealed Hiyerarşileri İç İçe Yerleştirme ve Birleştirme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“Sealed Hiyerarşileri İç İçe Yerleştirme ve Birleştirme” dersinde ne öğreneceğim?

Sealed türleri iç içe yerleştirerek karmaşık durum makineleri oluşturun. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Sealed Hiyerarşileri İç İçe Yerleştirme ve Birleştirme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. sealed class ve sealed interface: Hangisi Ne Zaman Kullanılır
  2. Sealed Hiyerarşilerle Eksiksiz when
  3. Sealed Sınıflarla Kullanıcı Arayüzü Durumlarını Modelleme
  4. Sealed Hiyerarşileri İç İçe Yerleştirme ve Birleştirme
← Kotlin Academy Sayfasına Dön