การสร้าง 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชัน Infix
- การสร้าง API ลักษณะ DSL
- ฟังก์ชัน tailrec
- ควรใช้แต่ละแบบเมื่อใด