متى تستخدمون كل واحدة
المفاضلات
متى تستخدمون كل واحدة درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
أداتان، ومهمتان مختلفتان
تتعلق دوال Infix بـ قابلية القراءة، بينما تتعلق دوال tailrec بـ الاستدعاء الذاتي الآمن والفعّال. وهما تحلان مشكلتين لا علاقة بينهما.
infix fun Int.add(o: Int) = this + o
tailrec fun sum(n: Int, acc: Int = 0): Int =
if (n == 0) acc else sum(n - 1, acc + n)
fun main() {
println(2 add 3)
println(sum(10))
}اختاروا Infix للواجهات السلسة
استخدموا infix عندما يُقرأ الاستدعاء بصورة أفضل من دون النقاط والأقواس، ولا سيما في DSLs وإنشاء أزواج Pair.
fun main() {
val pair = "id" to 100
println(pair)
}اختاروا tailrec للاستدعاء الذاتي العميق
استخدموا tailrec عندما يمكن لخوارزمية ذات استدعاء ذاتي أن تتعمق بما يكفي لتتسبب في تجاوز المكدس.
tailrec fun count(n: Int, acc: Int = 0): Int =
if (n == 0) acc else count(n - 1, acc + 1)
fun main() {
println(count(50000))
}مقايضات Infix
تزيل Infix علامات الترقيم، مما قد يقلل الوضوح لدى القارئين غير المعتادين عليها ويعقد الأسبقية. استخدموها فقط عندما تقدم فائدة واضحة.
infix fun Int.scaledBy(f: Int) = this * f
fun main() {
println(5 scaledBy 3)
}مقايضات tailrec
غالبًا ما يتطلب جعل الشيفرة ذات استدعاء ذاتي نهائي استخدام مُجمِّع، وقد يبدو ذلك أقل مباشرة من الحلقة العادية. وازنوا بين التعبيرية والبساطة.
tailrec fun product(n: Int, acc: Long = 1): Long =
if (n <= 1) acc else product(n - 1, acc * n)
fun main() {
println(product(6))
}متى تكون الحلقة أبسط؟
إذا كانت حلقة for أو while العادية أوضح من الاستدعاء الذاتي النهائي، ففضّلوا الحلقة. فالاستدعاء الذاتي أداة وليس متطلبًا.
fun sumLoop(n: Int): Int {
var total = 0
for (i in 1..n) total += i
return total
}
fun main() {
println(sumLoop(10))
}متى يكون الاستدعاء المسمى أوضح؟
إذا لم يكن اسم infix علاقة ثنائية واضحة، فإن استدعاء الطريقة العادي يعبّر عن القصد بصورة أفضل.
data class Temp(val c: Int) {
fun isWarmerThan(o: Temp) = c > o.c
}
fun main() {
println(Temp(30).isWarmerThan(Temp(20)))
}الجمع بينهما
الميزتان مستقلتان؛ إذ يمكن لبرنامج واحد استخدام infix للاستدعاءات القابلة للقراءة وtailrec للاستدعاء الذاتي الآمن.
infix fun Int.upto(n: Int) = (this..n).toList()
tailrec fun last(list: List<Int>): Int =
if (list.size == 1) list[0] else last(list.drop(1))
fun main() {
println(last(1 upto 5))
}قائمة تحقق لقابلية القراءة
اسألوا: هل تجعل infix الاستدعاء أوضح للقارئ الجديد؟ هل يمنع tailrec خطرًا حقيقيًا لتجاوز المكدس؟ إن لم يكن الأمر كذلك، ففضّلوا الدوال والحلقات العادية.
fun main() {
val r = (1..5).sum()
println(r)
}ملاحظة حول الأداء
يوفر tailrec أداءً شبيهًا بأداء الحلقات مع مساحة مكدس ثابتة. أما Infix فلا تكلفة لها أثناء التشغيل؛ فهي نحوية بحتة.
tailrec fun pow(base: Int, exp: Int, acc: Long = 1): Long =
if (exp == 0) acc else pow(base, exp - 1, acc * base)
fun main() {
println(pow(2, 10))
}ملخص القرار
Infix: استدعاءات ثنائية الأسلوب ذات معامل واحد، وسلسة القراءة. Tailrec: استدعاء ذاتي يجب أن يتوسع بأمان. لا تُعد أي منهما خيارًا افتراضيًا؛ فكلاهما اختيار مقصود.
infix fun String.joinWith(o: String) = "$this-$o"
fun main() {
println("a" joinWith "b")
}تحقق سريع
اختبروا مدى فهمكم لمتى تستخدمون كل ميزة.
مراجعة
لقد تعلمتم متى تستخدمون كل ميزة:
- استخدموا
infixللاستدعاءات الثنائية السلسة وسهلة القراءة ولـ DSLs. - استخدموا
tailrecللاستدعاء الذاتي الذي يجب أن يتوسع من دون تجاوز المكدس. - فضّلوا الحلقات العادية أو الدوال المسماة عندما تكون أوضح.
- الميزتان مستقلتان ويمكن الجمع بينهما.
infix fun Int.by(o: Int) = this * o
tailrec fun dec(n: Int): Int = if (n == 0) 0 else dec(n - 1)
fun main() {
println(3 by 4)
println(dec(1000))
}تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «متى تستخدمون كل واحدة» مجاني؟
نعم — نص درس «متى تستخدمون كل واحدة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «متى تستخدمون كل واحدة»؟
المفاضلات تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «متى تستخدمون كل واحدة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الدوال Infix
- بناء واجهات API شبيهة بـ DSL
- دوال tailrec
- متى تستخدمون كل واحدة