0Pricing
Kotlin Academy · درس

بناء واجهات API شبيهة بـ DSL

استخدموا Infix لمزيد من الوضوح

بناء واجهات API شبيهة بـ DSL درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

Infix من أجل الوضوح

تُعد دوال infix لبنة أساسية في DSLs الخاصة بـ Kotlin. فهي تجعل استدعاءات الواجهات البرمجية تُقرأ كعبارات طبيعية.

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

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

فكرة أداة بناء سلسة

يتيح الجمع بين infix والأنواع الصغيرة التعبير عن القصد بطريقة تصريحية.

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

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

تهيئة قائمة على Pair

تدعم دالة infix to خرائط التهيئة سهلة القراءة.

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

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

DSL للنطاقات

تُقرأ أدوات بناء النطاقات كأنها إنجليزية بفضل infix.

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

الجمع بين الشروط

يمكنكم صياغة عبارات سهلة القراءة شبيهة بالعبارات المنطقية باستخدام دوال infix.

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 مع مستقبلات

غالبًا ما تجمع DSLs الحقيقية بين infix وlambdas التي لها مستقبلات، مما يتيح لكتلة برمجية تهيئة كائن مباشرة.

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

يجعل نوع دالة مثل 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 تعتمد على lambda ذات مستقبل لتهيئة كائن.

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

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

حافظوا على قابلية قراءة DSLs

تقلل 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)
}

Infix مع Lambda

يؤدي الجمع بين دوال infix وlambdas إلى أدوات بناء مرنة ومعبرة.

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؟

تكون DSLs مفيدة في التهيئة المتكررة والمنظمة، مثل واجهات المستخدم وأدوات البناء والاختبارات. أما في المنطق المستخدم مرة واحدة، فالدوال العادية أبسط.

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

تحقق سريع

اختبروا مدى فهمكم للواجهات البرمجية الشبيهة بـ DSL.

مراجعة

لقد تعلمتم بناء واجهات برمجية شبيهة بـ DSL:

  • تجعل دوال infix الاستدعاءات تُقرأ كعبارات.
  • تتيح lambdas ذات المستقبلات (Type.() -> Unit) للكتل تهيئة الكائنات مباشرة.
  • تُعدّ apply وbuildList من DSLs في المكتبة القياسية.
  • استخدموا DSLs للتهيئة المنظمة والمتكررة، وحافظوا على قابليتها للقراءة.
class C { var x = 0 }
fun c(b: C.() -> Unit) = C().apply(b)

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

الأسئلة الشائعة

هل درس «بناء واجهات API شبيهة بـ DSL» مجاني؟

نعم — نص درس «بناء واجهات API شبيهة بـ DSL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «بناء واجهات API شبيهة بـ DSL»؟

استخدموا Infix لمزيد من الوضوح تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «بناء واجهات API شبيهة بـ DSL»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الدوال Infix
  2. بناء واجهات API شبيهة بـ DSL
  3. دوال tailrec
  4. متى تستخدمون كل واحدة
← العودة إلى Kotlin Academy