@DslMarker: Alıcı Sızıntısını Önleme
Derleme zamanında DSL iç içe yerleştirme kurallarını zorunlu kılmak için @DslMarker ek açıklamalarını kullanın.
@DslMarker: Alıcı Sızıntısını Önleme, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 2. 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.
Alıcı Sızıntısı Sorunu
İç içe DSL'lerde, içteki oluşturucu lambdası yanlışlıkla dıştaki alıcının üyelerine erişebilir. Örneğin bir td { } bloğunun içinde, dış tablo kapsamından tr { } çağırabilirsiniz; bu neredeyse hiçbir zaman amaçlanan bir davranış değildir.
Sızıntı Nasıl Görünür
@DslMarker olmadan derleyici, herhangi bir iç lambdadan dış kapsam işlevlerinin çağrılmasına izin verir; bu da kafa karıştırıcı ve hataya açık DSL kullanımına yol açar:
// Without @DslMarker — this compiles but is wrong:
html {
body {
table {
tr { // outer scope leaks in
tr { } // calling tr inside tr — nonsensical
}
}
}
}@DslMarker'ı Tanıtma
@DslMarker, kendi ek açıklama sınıfınıza uyguladığınız bir meta ek açıklamadır. DSL ek açıklamanızla işaretlenen her oluşturucu sınıfının örtük alıcısı, aynı DSL ek açıklamasını kullanan iç içe lambdalarda gizlenir.
@DslMarker
annotation class HtmlDsl
@HtmlDsl
class Table
@HtmlDsl
class TrÖrtük Alıcının Gizlenmesi Nasıl Çalışır
İç içe iki lambda, aynı @DslMarker ek açıklamasıyla işaretlenmiş alıcılara sahip olduğunda dıştaki alıcı, iç lambda içinde gizlenir. Alıcıya doğrudan erişmek derleme hatasına yol açar.
@DslMarker
annotation class HtmlDsl
@HtmlDsl class Html
@HtmlDsl class Body
@HtmlDsl class Div@DslMarker ile Tam Örnek
Ek açıklamayı bildirin, oluşturucu sınıflarını işaretleyin; ardından dış kapsam yöntemlerine yapılan iç içe çağrılar derleme zamanında yakalanır:
@DslMarker
annotation class MyCfgDsl
@MyCfgDsl
class ServerBuilder {
var port: Int = 8080
fun database(block: DbBuilder.() -> Unit) { /*...*/ }
}
@MyCfgDsl
class DbBuilder {
var url: String = ""
// Cannot call ServerBuilder.port here — compiler error
}this@ ile Kısıtlamadan Çıkma
İçteki bir lambdadan dıştaki alıcıya gerçekten erişmeniz gerekiyorsa etiketli bir this@OuterClass başvurusu kullanın. Bu, yanlışlıkla gerçekleşen sızıntının aksine açık ve bilinçli bir kullanımdır.
fun ServerBuilder.database(block: DbBuilder.() -> Unit) {
val db = DbBuilder()
db.block()
val serverPort = this@ServerBuilder.port // explicit outer access
}Birden Çok DSL ile @DslMarker
Farklı DSL'ler farklı @DslMarker ek açıklamaları kullanmalıdır. Farklı işaretlere sahip, ilişkili olmayan iki DSL, iç içe olsalar bile birbirini etkilemez.
@DslMarker annotation class HtmlDsl
@DslMarker annotation class GradleDsl
// HtmlDsl and GradleDsl receivers do not hide each otherOluşturuculara ve Alıcılara Uygulama
DSL ek açıklamanızı doğrudan oluşturucu sınıfına uygulayın. Ek açıklama, alıcı türü bu sınıf olan tüm lambda parametrelerine yayılır. Tek tek işlevlere başka bir ek açıklama eklemeniz gerekmez.
IDE Desteği
IntelliJ IDEA ve Android Studio, @DslMarker kullanıldığında dış alıcıya erişimi hemen hata olarak vurgular. Bu, DSL'yi yazarken veya kullanırken gerçek zamanlı geri bildirim sağlar.
Güvenlik için Tasarlama
İyi DSL tasarımı, her oluşturucu sınıfını @DslMarker ile eşleştirir. Ek açıklamanın getirdiği küçük yük, DSL kullanım kolaylığını büyük ölçüde artırır ve DSL kullanıcıları için tüm hata kategorilerini önler.
Standart Kitaplık Kullanımı
Kotlin'in kendi @DslMarker'ı kotlinx.html, Ktor yönlendirme DSL'si, Gradle Kotlin betiği ve buildMap/buildList oluşturucularında kullanılır. Her ciddi DSL araç setinin temel araçlarından biridir.
Kısa Kontrol
@DslMarker neyi önler?
Özet: @DslMarker
Temel çıkarımlar:
@DslMarkerolmadan dış alıcılar iç DSL lambdalarına sızar- Meta ek açıklamayla işaretlenmiş bir ek açıklama sınıfı tanımlayın ve bunu DSL'nizdeki tüm oluşturucu sınıflarına uygulayın
- Aynı işarete sahip iç içe lambdalar, dış kapsam üyelerini yanlışlıkla çağıramaz
- Dış kapsama gerçekten erişmeniz gerektiğinde
this@OuterClasskullanın
Sıkça Sorulan Sorular
“@DslMarker: Alıcı Sızıntısını Önleme” dersi ücretsiz mi?
Evet — “@DslMarker: Alıcı Sızıntısını Önleme” 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.
“@DslMarker: Alıcı Sızıntısını Önleme” dersinde ne öğreneceğim?
Derleme zamanında DSL iç içe yerleştirme kurallarını zorunlu kılmak için @DslMarker ek açıklamalarını kullanın. 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 2. dersidir.
“@DslMarker: Alıcı Sızıntısını Önleme” 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
- Alıcılı Lambda: DSL Temeli
- @DslMarker: Alıcı Sızıntısını Önleme
- Tür Güvenli HTML/Config DSL Oluşturma
- Kullanıcıları Bozmadan DSL'leri Sınama ve Geliştirme