0Pricing
Kotlin Academy · Lektion

DSL-ähnliche APIs erstellen

Verwenden Sie Infix für mehr Klarheit

DSL-ähnliche APIs erstellen ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Infix für mehr Klarheit

Infix-Funktionen sind ein Baustein von Kotlin-DSLs (domänenspezifischen Sprachen). Sie lassen API-Aufrufe wie natürliche Ausdrücke lesen.

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

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

Die Idee eines flüssig lesbaren Builders

Durch die Kombination von Infix-Funktionen mit kleinen Typen können Sie Absichten deklarativ ausdrücken.

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

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

Konfiguration mit Pairs

Die Infix-Funktion to ermöglicht gut lesbare Konfigurations-Maps.

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

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

Bereichs-DSL

Dank Infix-Funktionen lesen sich Builder für Bereiche wie natürliches Deutsch.

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

Bedingungen kombinieren

Mit Infix-Funktionen können Sie gut lesbare, boolesche Ausdrücke formulieren.

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

Lambdas mit Receivern

Echte DSLs kombinieren häufig Infix-Funktionen mit Lambdas, die Receiver haben, sodass ein Block ein Objekt direkt konfigurieren kann.

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

Receiver-Lambdas erklärt

Ein Funktionstyp wie Html.() -> Unit führt den Block so aus, als befände er sich innerhalb der Html-Instanz. Dadurch können Sie Member ohne Präfix aufrufen.

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 als Mini-DSL

Die Standardfunktion apply ist selbst eine DSL mit einem Receiver-Lambda zum Konfigurieren eines Objekts.

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

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

DSLs lesbar halten

Eine gute DSL minimiert überflüssige Elemente. Bevorzugen Sie Namen, durch die der Aufruf wie eine Beschreibung der Absicht wirkt.

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

Die Kombination von Infix-Funktionen mit Lambdas führt zu ausdrucksstarken Buildern.

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

Wann Sie eine DSL erstellen sollten

DSLs lohnen sich für wiederholte, strukturierte Konfigurationen (Benutzeroberflächen, Builder, Tests). Für einmalige Logik sind einfache Funktionen übersichtlicher.

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

Kurzer Test

Testen Sie Ihr Verständnis von DSL-ähnlichen APIs.

Zusammenfassung

Sie haben gelernt, DSL-ähnliche APIs zu erstellen:

  • Infix-Funktionen lassen Aufrufe wie Ausdrücke wirken.
  • Receiver-Lambdas (Type.() -> Unit) ermöglichen es Blöcken, Objekte direkt zu konfigurieren.
  • apply und buildList sind DSLs der Standardbibliothek.
  • Verwenden Sie DSLs für strukturierte, wiederholte Konfigurationen und halten Sie sie lesbar.
class C { var x = 0 }
fun c(b: C.() -> Unit) = C().apply(b)

fun main() {
    println(c { x = 9 }.x)
}

Häufig gestellte Fragen

Ist die Lektion „DSL-ähnliche APIs erstellen“ kostenlos?

Ja — der vollständige Text von „DSL-ähnliche APIs erstellen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „DSL-ähnliche APIs erstellen“?

Verwenden Sie Infix für mehr Klarheit Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Kotlin Academy zu starten?

Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „DSL-ähnliche APIs erstellen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?

Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Infix-Funktionen
  2. DSL-ähnliche APIs erstellen
  3. tailrec-Funktionen
  4. Wann Sie welche verwenden
← Zurück zu Kotlin Academy