Kotlin Academy · Lektion

Opbygning af DSL-lignende API'er

Brug infix for tydelighed

Lektion 2 af 413 trin

Opbygning af DSL-lignende API'er er en gratis Kotlin Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Kotlin Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Infix for tydelighed

Infix-funktioner er en byggesten i Kotlin-DSL'er (domænespecifikke sprog). De får API-kald til at ligne naturlige formuleringer.

infix fun String.eq(value: String) = this == value

fun main() {
    println("on" eq "on")
}

En idé til en flydende builder

Ved at kombinere infix med små typer kan du udtrykke hensigten deklarativt.

class Query(val field: String) {
    infix fun equals(value: String) = "$field = '$value'"
}

fun main() {
    val q = Query("name") equals "Sam"
    println(q)
}

Konfiguration baseret på Pair

Den infix-baserede to-funktion gør konfigurationsmaps lette at læse.

fun configure(vararg opts: Pair<String, Any>) = opts.toMap()

fun main() {
    val cfg = configure("debug" to true, "level" to 3)
    println(cfg)
}

Interval-DSL

Interval-buildere kan takket være infix læses som engelsk.

fun main() {
    val r = 1 until 10 step 2
    println(r.toList())
}

Kombinering af betingelser

Du kan skabe læsbare, boolske formuleringer med infix-funktioner.

data class Rule(val ok: Boolean) {
    infix fun and(other: Rule) = Rule(ok && other.ok)
}

fun main() {
    val result = Rule(true) and Rule(false)
    println(result.ok)
}

Lambdaer med modtagere

Ægte DSL'er kombinerer ofte infix med lambdaer, der har modtagere, så en blok kan konfigurere et objekt direkte.

class Html {
    val parts = mutableListOf<String>()
    fun p(text: String) { parts.add("<p>$text</p>") }
}

fun html(block: Html.() -> Unit): Html {
    val h = Html()
    h.block()
    return h
}

fun main() {
    val page = html { p("Hi") }
    println(page.parts)
}

Forklaring af lambdaer med modtager

En funktionstype som Html.() -> Unit får blokken til at køre, som om den befandt sig inde i Html-instansen, så medlemmer kan kaldes uden præfiks.

class Box { var value = 0 }

fun box(init: Box.() -> Unit): Box {
    val b = Box()
    b.init()
    return b
}

fun main() {
    val b = box { value = 42 }
    println(b.value)
}

Apply som en mini-DSL

Standardfunktionen apply er i sig selv en DSL med en lambda med modtager til konfiguration af et objekt.

class Server {
    var host = ""
    var port = 0
}

fun main() {
    val s = Server().apply {
        host = "localhost"
        port = 8080
    }
    println("${s.host}:${s.port}")
}

Gør DSL'er læsbare

En god DSL minimerer støj. Foretræk navne, der får kaldestedet til at ligne en beskrivelse af hensigten.

data class Style(var bold: Boolean = false)

fun style(block: Style.() -> Unit) = Style().apply(block)

fun main() {
    val s = style { bold = true }
    println(s.bold)
}

Infix plus lambda

Kombinationen af infix-funktioner og lambdaer giver udtryksfulde buildere.

class Table {
    val rows = mutableListOf<String>()
    infix fun row(text: String) { rows.add(text) }
}

fun table(block: Table.() -> Unit) = Table().apply(block)

fun main() {
    val t = table {
        row("A")
        row("B")
    }
    println(t.rows)
}

Hvornår skal du bygge en DSL?

DSL'er kan betale sig til gentagen, struktureret konfiguration (brugergrænseflader, buildere og test). Til engangslogik er almindelige funktioner enklere.

fun main() {
    val list = buildList {
        add(1)
        add(2)
    }
    println(list)
}

Hurtig kontrol

Test din forståelse af DSL-lignende API'er.

Opsummering

Du har lært at bygge DSL-lignende API'er:

  • Infix-funktioner får kald til at ligne formuleringer.
  • Lambdaer med modtager (Type.() -> Unit) lader blokke konfigurere objekter direkte.
  • apply og buildList er DSL'er i standardbiblioteket.
  • Brug DSL'er til struktureret, gentagen konfiguration, og sørg for, at de er læsbare.
class C { var x = 0 }
fun c(b: C.() -> Unit) = C().apply(b)

fun main() {
    println(c { x = 9 }.x)
}
Gratis at komme i gang

Lær Kotlin med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Opbygning af DSL-lignende API'er” gratis?

Ja — alle 3 lektioner i læringssporet Kotlin Academy, inklusive “Opbygning af DSL-lignende API'er”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Opbygning af DSL-lignende API'er”?

Brug infix for tydelighed Du øver dig i Kotlin Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Kotlin Academy?

Der kræves ingen tidligere erfaring. Kotlin Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Opbygning af DSL-lignende API'er”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Kotlin Academy-lektion?

Ja. Alle Kotlin Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Infix-funktioner
  2. Opbygning af DSL-lignende API'er
  3. tailrec-funktioner
  4. Hvornår De skal bruge hver af dem
← Tilbage til Kotlin Academy