0Pricing
Kotlin Academy · บทเรียน

การสร้าง API ลักษณะ DSL

ใช้ infix เพื่อความชัดเจน

การสร้าง API ลักษณะ DSL เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

อินฟิกซ์เพื่อความชัดเจน

ฟังก์ชันอินฟิกซ์เป็นส่วนประกอบสำคัญของ DSL ในภาษา Kotlin ซึ่งเป็นภาษาสำหรับโดเมนเฉพาะ ฟังก์ชันเหล่านี้ทำให้การเรียกใช้เอพีไออ่านได้เหมือนวลีตามธรรมชาติ

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

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

แนวคิดตัวสร้างที่อ่านได้อย่างลื่นไหล

การผสมอินฟิกซ์กับชนิดข้อมูลขนาดเล็กช่วยให้คุณสื่อเจตนาในลักษณะประกาศได้

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

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

การกำหนดค่าด้วยคู่ข้อมูล

ฟังก์ชันอินฟิกซ์ to ช่วยให้แมปการกำหนดค่าอ่านเข้าใจได้ง่าย

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

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

DSL สำหรับช่วง

ตัวสร้างช่วงอ่านได้เหมือนภาษาอังกฤษด้วยคุณสมบัติอินฟิกซ์

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

การรวมเงื่อนไข

คุณสามารถสร้างวลีที่อ่านเข้าใจง่ายและมีลักษณะเหมือนค่าบูลีนด้วยฟังก์ชันอินฟิกซ์

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

แลมบ์ดาที่มีตัวรับ

DSL ที่แท้จริงมักใช้ฟังก์ชันอินฟิกซ์ร่วมกับแลมบ์ดาที่มีตัวรับ ทำให้บล็อกสามารถกำหนดค่าอ็อบเจ็กต์ได้โดยตรง

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

อธิบายแลมบ์ดาที่มีตัวรับ

ชนิดฟังก์ชันอย่าง Html.() -> Unit ทำให้บล็อกทำงานเสมือนอยู่ภายในอินสแตนซ์ Html ดังนั้นจึงเรียกใช้สมาชิกได้โดยไม่ต้องมีคำนำหน้า

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 เป็น DSL ขนาดเล็ก

ฟังก์ชันมาตรฐาน apply เองก็เป็น DSL ที่ใช้แลมบ์ดาซึ่งมีตัวรับสำหรับกำหนดค่าอ็อบเจ็กต์

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

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

รักษาความอ่านง่ายของ DSL

DSL ที่ดีช่วยลดส่วนเกิน ควรเลือกชื่อที่ทำให้จุดเรียกใช้อ่านเหมือนคำอธิบายเจตนา

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

อินฟิกซ์ร่วมกับแลมบ์ดา

การผสมฟังก์ชันอินฟิกซ์กับแลมบ์ดาช่วยสร้างตัวสร้างที่สื่อความหมายได้ดี

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

เมื่อใดควรสร้าง DSL

DSL มีประโยชน์กับการกำหนดค่าที่มีโครงสร้างและทำซ้ำบ่อย เช่น ส่วนติดต่อผู้ใช้ ตัวสร้าง และการทดสอบ สำหรับตรรกะที่ใช้เพียงครั้งเดียว ฟังก์ชันทั่วไปจะเรียบง่ายกว่า

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

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับเอพีไอที่มีลักษณะเป็น DSL

สรุปทบทวน

คุณได้เรียนรู้การสร้างเอพีไอที่มีลักษณะเป็น DSL:

  • ฟังก์ชันอินฟิกซ์ทำให้การเรียกใช้อ่านเหมือนวลี
  • แลมบ์ดาที่มีตัวรับ (Type.() -> Unit) ทำให้บล็อกกำหนดค่าอ็อบเจ็กต์ได้โดยตรง
  • apply และ buildList เป็น DSL จากไลบรารีมาตรฐาน
  • ใช้ DSL กับการกำหนดค่าที่มีโครงสร้างและทำซ้ำบ่อย พร้อมรักษาความอ่านง่ายไว้
class C { var x = 0 }
fun c(b: C.() -> Unit) = C().apply(b)

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

คำถามที่พบบ่อย

บทเรียน “การสร้าง API ลักษณะ DSL” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้าง API ลักษณะ DSL” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสร้าง API ลักษณะ DSL”

ใช้ infix เพื่อความชัดเจน คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การสร้าง API ลักษณะ DSL” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชัน Infix
  2. การสร้าง API ลักษณะ DSL
  3. ฟังก์ชัน tailrec
  4. ควรใช้แต่ละแบบเมื่อใด
← กลับไปที่ Kotlin Academy