Kotlin Academy · Lezione

Quando utilizzare ciascuna opzione

Compromessi

Lezione 4 di 413 passaggi

Quando utilizzare ciascuna opzione è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.

Due strumenti, funzioni diverse

Le funzioni infix riguardano la leggibilità; le funzioni tailrec riguardano la ricorsione sicura ed efficiente. Risolvono problemi indipendenti.

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

Scelga infix per le API fluide

Scelga infix quando una chiamata risulta più leggibile senza punti e parentesi, soprattutto nelle DSL e nella creazione di Pair.

fun main() {
    val pair = "id" to 100
    println(pair)
}

Scelga tailrec per la ricorsione profonda

Utilizzi tailrec quando un algoritmo ricorsivo potrebbe ricorrere abbastanza in profondità da causare uno stack overflow.

tailrec fun count(n: Int, acc: Int = 0): Int =
    if (n == 0) acc else count(n - 1, acc + 1)

fun main() {
    println(count(50000))
}

Compromessi di infix

Infix elimina la punteggiatura, cosa che può ridurre la chiarezza per chi non conosce il codice e complicare la precedenza. Lo utilizzi solo quando è chiaramente utile.

infix fun Int.scaledBy(f: Int) = this * f

fun main() {
    println(5 scaledBy 3)
}

Compromessi di tailrec

Rendere il codice ricorsivo in coda richiede spesso un accumulatore, che può sembrare meno diretto di un ciclo normale. Valuti l'espressività rispetto alla semplicità.

tailrec fun product(n: Int, acc: Long = 1): Long =
    if (n <= 1) acc else product(n - 1, acc * n)

fun main() {
    println(product(6))
}

Quando un ciclo è più semplice

Se un semplice ciclo for o while è più chiaro della ricorsione in coda, preferisca il ciclo. La ricorsione è uno strumento, non un requisito.

fun sumLoop(n: Int): Int {
    var total = 0
    for (i in 1..n) total += i
    return total
}

fun main() {
    println(sumLoop(10))
}

Quando una chiamata con nome è più chiara

Se un nome infix non rappresenta chiaramente una relazione binaria, una normale chiamata a metodo comunica meglio l'intento.

data class Temp(val c: Int) {
    fun isWarmerThan(o: Temp) = c > o.c
}

fun main() {
    println(Temp(30).isWarmerThan(Temp(20)))
}

Combinare entrambe

Le due funzionalità sono indipendenti; uno stesso programma può utilizzare infix per chiamate leggibili e tailrec per una ricorsione sicura.

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

Lista di controllo della leggibilità

Si chieda: infix rende la chiamata più chiara per chi è alle prime armi? tailrec previene un rischio reale di overflow? In caso contrario, preferisca funzioni normali e cicli.

fun main() {
    val r = (1..5).sum()
    println(r)
}

Nota sulle prestazioni

tailrec offre prestazioni simili a quelle di un ciclo utilizzando uno spazio dello stack costante. Infix non ha costi a runtime: è puramente sintattico.

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

Riepilogo della scelta

Infix: chiamate fluide a un argomento in stile binario. Tailrec: ricorsione che deve scalare in sicurezza. Nessuna delle due è una scelta predefinita: entrambe vanno adottate consapevolmente.

infix fun String.joinWith(o: String) = "$this-$o"

fun main() {
    println("a" joinWith "b")
}

Verifica rapida

Verifichi la Sua comprensione di quando utilizzare ciascuna funzionalità.

Riepilogo

Ha imparato quando utilizzare ciascuna funzionalità:

  • Utilizzi infix per chiamate fluide e leggibili in stile binario e per le DSL.
  • Utilizzi tailrec per ricorsioni che devono scalare senza causare uno stack overflow.
  • Preferisca cicli normali o funzioni con nome quando sono più chiari.
  • Le due funzionalità sono indipendenti e possono essere combinate.
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))
}
Gratis per iniziare

Impara Kotlin con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Quando utilizzare ciascuna opzione» è gratuita?

Sì — il testo completo di «Quando utilizzare ciascuna opzione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.

Cosa imparerò in «Quando utilizzare ciascuna opzione»?

Compromessi Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Kotlin Academy?

Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Quando utilizzare ciascuna opzione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?

Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Funzioni infix
  2. Creazione di API simili a DSL
  3. Funzioni tailrec
  4. Quando utilizzare ciascuna opzione
← Torna a Kotlin Academy