Esta pagina se ve mejor con JavaScript habilitado

Funciones Infix en Kotlin

 ·  ☕ 4 minutos lectura  ·  ✍️ Ignacio Carrión

Explorando las funciones Infix en Kotlin

Kotlin, es un lenguaje de programación moderno con funcionalidades que permiten escribir un código más expresivo y conciso. Una de estas funcionalidades son las infix functions, que permiten escribir código más limpio y legible. En este post, exploraremos que son las funciones infix, como usarlas y algunos ejemplo prácticos.


Qué son las funciones Infix?

Las funciones infix en Kotlin son un tipo especial de función que pueden ser llamadas sin el uso de paréntesis o el punto. Esto puede hacer que ciertos patrones de código se lean de forma más natural, asemejándose a la sintaxis tradicional relacionada con matemáticas o DSL.

Este sería un ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Point(val x: Int, val y: Int) {
    infix fun moveBy(offset: Point): Point {
        return Point(this.x + offset.x, this.y + offset.y)
    }
}

fun main() {
    val point1 = Point(2, 3)
    val offset = Point(1, 1)

    // Using the infix notation
    val newPoint = point1 moveBy offset

    println("New Point: (\${newPoint.x}, \${newPoint.y})")
}

En este ejemplo, la función moveBy se llama usando la notación infix, mejorando la legibilidad.


Reglas y sintaxis

Aquí estan unos puntos clave acerca de las funciones infix:

  • Solo un parámetro: La función debe recibir exáctamente un parámetro.
  • Miembros de clase o funciones de extensión: Debe estar definida como una función de clase o una función de extensión.
  • No Varargs or argumentos por defecto: El parámetro no puede tener valores por defecto o ser un vararg.

Ejemplo con una función de extensión:

1
2
3
4
5
6
7
8
infix fun String.concatWith(other: String): String {
    return this + other
}

fun main() {
    val result = "Hello" concatWith " World"
    println(result)  // Outputs: Hello World
}

Casos de uso prácticos

Las funciones infix son comunmente utilizadas en Kotlin para hacer el código más conciso y legible. Brillan en escenarios donde las operaciones intuitivas son necesarias, como cuando se trabaja con colecciones, rangos o expresiones de frameworks de testing o de inyección de dependencias. Abajo de estas líneas hay algunos ejemplos de como las funciones infix pueden simplificar el código que escribimos diariamente:

  1. Mapeando claves con valores: La función to en la librería estandar de Kotlin es una función infix que ayuda a crear pares, normalmente se usan en los mapas.

    1
    2
    3
    4
    
    fun main() {
        val map = mapOf("key1" to "value1", "key2" to 42)
        println(map)  // Outputs: {key1=value1, key2=42}
    }
    
  2. Definiendo rangos: La función until es una función infix que se usa para definir rangos donde se excluye el límite superior.

    1
    2
    3
    4
    5
    
    fun main() {
        for (i in 1 until 5) {
            println(i)  // Outputs: 1, 2, 3, 4
        }
    }
    
  3. Definiendo el comportamiento de mocks: Librerías tales como MockK usan funciones infix para crear configuraciones de test más expresivas y legibles.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    class Calculator {
        fun add(a: Int, b: Int): Int = a + b
    }
    
    fun test() {
        val calculator = mockk<Calculator>()
        every { calculator.add(1, 2) } returns 3
    
        println(calculator.add(1, 2))  // Outputs: 3
    }
    
  4. Inyección de dependencias con Koin: Koin, un framework de inyección de dependencias para Kotlin, usa la función infix bind para definir las relaciones entre clases e interfaces de una manera más legible y limpia.

    1
    2
    3
    4
    5
    6
    
    interface MyInterface
    class MyImplementation : MyInterface
    
    val appModule = module {
        single { MyImplementation() } bind MyInterface::class
    }
    

    La función infix bind mejora la legibilidad cuando declaras que implementación específica debe usarse para inyectar una interfaz.


Cuando usar funciones Infix

Mientras las funciones infix pueden hacer el código más limpio, deben usarse con cuidado:

  • La operación es intuitiva y fácilmente entendible.
  • Cuando mejoran la legibilidad y el flujo.
  • Encajan naturalmente dentro del DSL.

Evitar las funciones infix en los siguientes casos:

  • Puede llevar a una sintaxis ambigua y confusa.
  • El propósito de la función no está claro con el nombre o uso.

Conclusión

Las funciones infix de Kotlin son una herramienta poderosa para crear código más expresivo y legible. Definiendo un DSL, simplificando operaciones matemáticas, o mejorando expresiones lógicas, las funciones infix pueden hacer tu código más eleganto. De todas formas, al igual que con cualquier otra funcionalidad, debe ser usadas con cuidado para mantener la claridad del código y evitar sobrecomplicaciones.

Intenta incorporar funciones infix en tu próximo proyecto de Kotlin y fíjate como transforma tu código! ¿Cuales son tus funciones infix favoritas o que formas creativas tienes de usarlas?

compartir en

Ignacio Carrión
Escrito por
Ignacio Carrión
Android Developer