0Pricing
Kotlin Academy · Lección

Cuándo usar cada una

Ventajas y desventajas

Cuándo usar cada una es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.

Dos herramientas, funciones diferentes

Las funciones infix buscan la legibilidad; las funciones tailrec, una recursión segura y eficiente. Resuelven problemas distintos.

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

Elija infix para API fluidas

Recurra a infix cuando una llamada se lea mejor sin puntos ni paréntesis, especialmente en DSL y al crear pares.

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

Elija tailrec para recursiones profundas

Utilice tailrec cuando un algoritmo recursivo pueda alcanzar una profundidad suficiente para desbordar la pila.

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

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

Compromisos de infix

Infix elimina la puntuación, lo que puede reducir la claridad para quienes no conozcan el código y complicar la precedencia. Úselo solo cuando ayude claramente.

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

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

Compromisos de tailrec

Convertir el código en recursivo de cola suele requerir un acumulador, lo que puede parecer menos directo que un bucle normal. Sopese la expresividad frente a la sencillez.

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

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

Cuándo un bucle es más sencillo

Si un bucle for o while normal resulta más claro que la recursión de cola, prefiera el bucle. La recursión es una herramienta, no una obligación.

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

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

Cuándo una llamada con nombre es más clara

Si un nombre infix no representa obviamente una relación binaria, una llamada normal a un método comunica mejor la intención.

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

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

Combinar ambas

Las dos características son independientes; un mismo programa puede usar infix para llamadas legibles y tailrec para una recursión segura.

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 de comprobación de legibilidad

Pregúntese: ¿infix hace que la llamada sea más clara para alguien que acaba de empezar? ¿tailrec evita un riesgo real de desbordamiento? Si no es así, prefiera funciones y bucles normales.

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

Nota sobre el rendimiento

tailrec ofrece un rendimiento similar al de un bucle con un espacio de pila constante. Infix no tiene coste en tiempo de ejecución; es puramente sintáctico.

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

Resumen de la decisión

Infix: llamadas fluidas de estilo binario con un argumento. Tailrec: recursión que debe escalar de forma segura. Ninguna es la opción predeterminada; ambas son decisiones deliberadas.

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

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

Comprobación rápida

Compruebe su comprensión de cuándo utilizar cada característica.

Resumen

Ha aprendido cuándo utilizar cada una:

  • Utilice infix para llamadas fluidas y legibles de estilo binario y para DSL.
  • Utilice tailrec para recursiones que deban escalar sin desbordar la pila.
  • Prefiera bucles normales o funciones con nombre cuando sean más claros.
  • Las dos características son independientes y se pueden combinar.
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))
}

Preguntas frecuentes

¿La lección «Cuándo usar cada una» es gratis?

Sí — el texto completo de «Cuándo usar cada una» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Cuándo usar cada una»?

Ventajas y desventajas Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Kotlin Academy?

No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Cuándo usar cada una»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?

Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Funciones infix
  2. Construcción de API similares a DSL
  3. Funciones tailrec
  4. Cuándo usar cada una
← Volver a Kotlin Academy