Tür Güvenli HTML/Config DSL Oluşturma
Oluşturucu kalıpları ve uzantı lambda'larıyla basit bir yapılandırma DSL'i uygulayın.
Tür Güvenli HTML/Config DSL Oluşturma, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 3. 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.
Amaç: Pratik Bir DSL
Kotlin'de asgari ama gerçekçi bir HTML oluşturucu DSL'si oluşturacağız. Aynı örüntüler tüm yapılandırma, test düzeneği veya rapor oluşturucularına uygulanabilir. Sonuç, dize birleştirmenin yerini alan, tür güvenli ve IDE dostu bir API'dir.
Tag Temel Sınıfını Tanımlama
Tüm HTML öğeleri ortak bir yapıya sahiptir: ad, öznitelikler ve alt öğeler. Bir temel sınıfla başlayın:
open class Tag(val name: String) {
val attrs = mutableMapOf<String, String>()
val children = mutableListOf<Tag>()
fun render(indent: Int = 0): String {
val pad = " ".repeat(indent)
val attrStr = if (attrs.isEmpty()) "" else " " + attrs.entries.joinToString(" ") { "${it.key}=\"${it.value}\"" }
val body = children.joinToString("\n") { it.render(indent + 2) }
return "$pad<$name$attrStr>\n$body\n$pad</$name>"
}
}@DslMarker Uygulama
İç kapsamların yanlışlıkla dış kapsam yöntemlerini çağırmaması için tüm oluşturucu sınıflarını işaretleyin:
@DslMarker
annotation class HtmlDsl
@HtmlDsl class Html : Tag("html")
@HtmlDsl class Head : Tag("head")
@HtmlDsl class Body : Tag("body")
@HtmlDsl class Div : Tag("div")
@HtmlDsl class P : Tag("p")Oluşturucu İşlevleri Ekleme
Her etiket sınıfı, bir alt etiket oluşturan, bloğu uygulayan ve etiketi alt öğelere ekleyen bir genişletme işlevi alır:
fun Html.head(block: Head.() -> Unit) = Head().also { it.block(); children += it }
fun Html.body(block: Body.() -> Unit) = Body().also { it.block(); children += it }
fun Body.div(block: Div.() -> Unit) = Div().also { it.block(); children += it }
fun Div.p(text: String) = P().also { it.attrs["text"] = text; children += it }Üst Düzey html Oluşturucusu
Kök öğeyi oluşturan ve kullanıcı bloğunu uygulayan üst düzey bir giriş noktası sağlayın:
fun html(block: Html.() -> Unit): Html {
val root = Html()
root.block()
return root
}DSL'yi Kullanma
Sonuç, temiz ve okunabilir bir DSL'dir:
val page = html {
head { }
body {
div {
p("Hello, DSL!")
}
}
}
println(page.render())Öznitelik Ekleme
Keyfi öznitelikleri akıcı biçimde ayarlamak için bir attr yardımcısı ekleyin:
fun Tag.attr(key: String, value: String) { attrs[key] = value }
// Usage
div {
attr("class", "container")
p("Content")
}Yapılandırma DSL'si Örüntüsü
Aynı örüntü yapılandırma nesneleri için de işe yarar. HTML etiketleri yerine alan sınıflarını kullanın:
class ServerConfig {
var host = "localhost"
var port = 8080
var db: DbConfig? = null
fun database(block: DbConfig.() -> Unit) { db = DbConfig().apply(block) }
}
fun server(block: ServerConfig.() -> Unit) = ServerConfig().apply(block)İç İçe Yerleştirme ve Birleştirme
Her oluşturucu işlevi oluşturulan nesneyi döndürdüğü için oluşturucuları serbestçe birleştirebilirsiniz. DSL'deki iç içe geçme derinliği, veri hiyerarşisinin derinliğiyle eşleşir.
Türlerle Hataları Önleme
Tür sistemi yapıyı zorunlu kılar: Head içinde body { } çağıramazsınız; çünkü Head sınıfının body genişletme işlevi yoktur. Geçersiz yapılar derleme zamanı hatalarına yol açar.
Oluşturma ve Test Etme
DSL, düz bir Kotlin nesne ağacı ürettiği için oluşturma ve test etme kolaydır: render() çağırıp çıktı dizesini doğrulayabilir veya testlerde nesne ağacını dolaşabilirsiniz.
DSL'yi İleride Genişletme
Yeni etiketler veya yapılandırma seçenekleri eklemek, yalnızca uygun alıcı sınıfa yeni uzantı işlevleri eklemeyi gerektirir. Mevcut çağrı noktaları etkilenmez — pratikte açık/kapalı ilkesidir.
Hızlı Kontrol
Kotlin HTML/yapılandırma DSL yapısını "tür güvenli" yapan nedir?
Özet: Tür Güvenli DSL Oluşturma
Temel adımlar:
- Hiyerarşinin her düzeyi için oluşturucu sınıflar tanımlayın
- Alıcı sızıntısını önlemek için
@DslMarkerile işaretleyin - Alt nesneleri oluşturan, yapılandıran ve ekleyen uzantı işlevleri yazın
- Üst düzey bir giriş noktası işlevi sunun
- Oluşturma ve sınama işlemleri yalın Kotlin nesneleri üzerinde çalışır
Sıkça Sorulan Sorular
“Tür Güvenli HTML/Config DSL Oluşturma” dersi ücretsiz mi?
Evet — “Tür Güvenli HTML/Config DSL Oluşturma” 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.
“Tür Güvenli HTML/Config DSL Oluşturma” dersinde ne öğreneceğim?
Oluşturucu kalıpları ve uzantı lambda'larıyla basit bir yapılandırma DSL'i uygulayı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 3. dersidir.
“Tür Güvenli HTML/Config DSL Oluşturma” 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