Kapan Menggunakan Masing-masingnya
Berbagai kompromi
Kapan Menggunakan Masing-masingnya adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.
Dua Alat, Tugas yang Berbeda
Fungsi infiks berkaitan dengan keterbacaan; fungsi rekursi ekor berkaitan dengan rekursi yang aman dan efisien. Keduanya menyelesaikan masalah yang tidak berhubungan.
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))
}Pilih Infiks untuk API yang Mengalir
Gunakan infiks ketika suatu pemanggilan terbaca lebih baik tanpa titik dan tanda kurung, terutama dalam DSL dan pembangunan pasangan.
fun main() {
val pair = "id" to 100
println(pair)
}Pilih tailrec untuk Rekursi Mendalam
Gunakan tailrec ketika sebuah algoritma rekursif dapat melakukan rekursi cukup dalam hingga menyebabkan luapan tumpukan.
tailrec fun count(n: Int, acc: Int = 0): Int =
if (n == 0) acc else count(n - 1, acc + 1)
fun main() {
println(count(50000))
}Kompromi Infiks
Infiks menghilangkan tanda baca, yang dapat mengurangi kejelasan bagi pembaca yang belum terbiasa dan memperumit prioritas. Gunakan hanya jika manfaatnya benar-benar jelas.
infix fun Int.scaledBy(f: Int) = this * f
fun main() {
println(5 scaledBy 3)
}Kompromi tailrec
Membuat kode berbentuk rekursi ekor sering kali memerlukan akumulator, yang dapat terasa kurang langsung dibandingkan perulangan biasa. Pertimbangkan keseimbangan antara ekspresivitas dan kesederhanaan.
tailrec fun product(n: Int, acc: Long = 1): Long =
if (n <= 1) acc else product(n - 1, acc * n)
fun main() {
println(product(6))
}Kapan Perulangan Lebih Sederhana
Jika perulangan for atau while biasa lebih jelas daripada rekursi ekor, pilihlah perulangan tersebut. Rekursi adalah alat, bukan keharusan.
fun sumLoop(n: Int): Int {
var total = 0
for (i in 1..n) total += i
return total
}
fun main() {
println(sumLoop(10))
}Kapan Pemanggilan Bernama Lebih Jelas
Jika nama infiks tidak secara jelas menunjukkan hubungan biner, pemanggilan metode biasa menyampaikan maksud dengan lebih baik.
data class Temp(val c: Int) {
fun isWarmerThan(o: Temp) = c > o.c
}
fun main() {
println(Temp(30).isWarmerThan(Temp(20)))
}Menggabungkan Keduanya
Kedua fitur ini tidak bergantung satu sama lain; satu program dapat menggunakan infiks untuk pemanggilan yang mudah dibaca dan rekursi ekor untuk rekursi yang aman.
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))
}Daftar Periksa Keterbacaan
Tanyakan: apakah infiks membuat pemanggilan lebih jelas bagi pembaca baru? Apakah rekursi ekor mencegah risiko luapan tumpukan yang nyata? Jika tidak, pilih fungsi biasa dan perulangan.
fun main() {
val r = (1..5).sum()
println(r)
}Catatan Kinerja
tailrec memberikan kinerja seperti perulangan dengan ruang tumpukan konstan. Infiks tidak memiliki biaya saat dijalankan; infiks murni bersifat sintaktis.
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))
}Ringkasan Keputusan
Infiks: pemanggilan bergaya biner dengan satu argumen yang mengalir lancar. Rekursi ekor: rekursi yang harus berkembang dengan aman. Keduanya bukan pilihan bawaan; keduanya merupakan pilihan yang disengaja.
infix fun String.joinWith(o: String) = "$this-$o"
fun main() {
println("a" joinWith "b")
}Pemeriksaan Singkat
Uji pemahaman Anda tentang kapan setiap fitur sebaiknya digunakan.
Rangkuman
Anda telah mempelajari kapan menggunakan masing-masing fitur:
- Gunakan
infixuntuk pemanggilan bergaya biner dan DSL yang mengalir serta mudah dibaca. - Gunakan
tailrecuntuk rekursi yang harus berkembang tanpa luapan tumpukan. - Utamakan perulangan biasa atau fungsi bernama jika lebih jelas.
- Kedua fitur ini tidak saling bergantung dan dapat digabungkan.
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))
}Pertanyaan yang Sering Diajukan
Apakah pelajaran “Kapan Menggunakan Masing-masingnya” gratis?
Ya — teks lengkap “Kapan Menggunakan Masing-masingnya” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Kapan Menggunakan Masing-masingnya”?
Berbagai kompromi Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Kotlin Academy?
Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Kapan Menggunakan Masing-masingnya” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?
Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Fungsi Infix
- Membangun API Mirip DSL
- Fungsi tailrec
- Kapan Menggunakan Masing-masingnya