48 - Package e Import

Los paquetes nos permiten agrupar clases, funciones, objetos, constantes etc. en un espacio de nombres para facilitar su uso y mantenimiento.

Los paquetes agrupan funcionalidades sobre un tema específico, por ejemplo funcionalidades para el acceso a base de datos, interfaces visuales, encriptación de datos, acceso a archivos, comunicaciones en la web etc.

Los paquetes son una forma muy efectiva de organizar nuestro código para ser utilizado en nuestro proyecto o reutilizado por otros.

La librería estándar de Kotlin se organiza en paquetes, los principales son:

kotlin
kotlin.annotation
kotlin.collections
kotlin.comparisons
kotlin.io
kotlin.ranges
kotlin.sequences
kotlin.text

Todos estos paquetes se importan en forma automática cuando compilamos nuestra aplicación.

Por ejemplo el paquete kotlin.collections tiene las declaraciones de clases e interfaces: List, MutableList etc.

Veremos ahora como crear nuestro propio paquete y luego consumir su contenido.

Problema 1

Crear un paquete llamado matematica y definir dos funciones en su interior que permitan sumar y restar dos valores de tipo Int.

Importar luego el paquete desde nuestro programa principal y llamar a dichas funciones.

El primer paso luego de crear el Proyecto190 nos posicionamos en la carpeta src, presionamos el botón derecho del mouse y seleccionamos New -> Package:

creacion package kotlin

En el diálogo que aparece ingresamos el nombre del paquete a crear "matematica":

creacion package kotlin

Ahora dentro de esta carpeta procedemos a crear un archivo llamado "funciones" presionando el botón derecho del mouse sobre la carpeta "matematica" que acabamos de crear:

creacion package kotlin

El archivo que crearemos en este paquete se llamará "funciones" (un paquete puede tener muchos archivos):

creacion package kotlin

Ahora ya tenemos el archivo donde codificaremos las funciones de sumar y restar:

creacion package kotlin

Procedemos:

Proyecto190 - funciones.kt

package matematica

fun sumar(valor1: Int, valor2: Int) = valor1 + valor2

fun restar(valor1: Int, valor2: Int) = valor1 - valor2

El nombre del paquete va en la primera línea del código fuente después de la palabra clave package.

Ahora codificaremos nuestro programa principal donde consumiremos la funcionalidad de este paquete. Crearemos el archivo Principal.tk en la carpeta src como siempre:

Proyecto190 - Principal.kt

import matematica.*

fun main(args: Array<String>) {
    val su = sumar(5, 7)
    println("La suma es $su")
    val re = restar(10, 3)
    println("La resta es $re")
}

Para importar todas las funciones definidas en el paquete matematica utilizamos la palabra clave import seguida del nombre del paquete y luego un punto y el asterisco:

import matematica.*

Una vez importado el paquete completo podemos llamar a sus funciones:

    val su = sumar(5, 7)
    ...
    val re = restar(10, 3)

Si no hacemos el import se presenta un error sintáctico cuando queremos compilar el programa:

error no importar package kotlin

Hay varias variantes cuando hacemos uso del import. La primera es que podemos importar por ejemplo solo la función de restar del paquete matematica:

import matematica.restar

fun main(args: Array<String>) {
    val re = restar(10, 3)
    println("La resta es $re")
}

Como vemos indicamos luego del nombre del paquete la función a importar. Solo podremos llamar en nuestro algoritmo a la función restar.

Cuando importamos una funcionalidad podemos crear un alias, en el ejemplo siguiente importamos la función restar y la renombramos con el nombre restaEnteros:

import matematica.restar as restaEnteros

fun main(args: Array<String>) {
    val re = restaEnteros(10, 3)
    println("La resta es $re")
}

Esto es útil cuando importamos por ejemplo funciones de dos paquetes que tienen el mismo nombre.

Si no disponemos el import la otra posibilidad es indicar el paquete previo al nombre de la función (esto es muy engorroso si tenemos que acceder a muchas funcionalidades de un paquete):

fun main(args: Array<String>) {
    val su = matematica.sumar(5, 7)
    println("La suma es $su")
    val re = matematica.restar(10, 3)
    println("La resta es $re")
}

Problema propuesto

  • Crear un paquete llamado entradateclado. Dentro del paquete crear un archivo llamado entrada.kt y definir las siguientes funciones:
    package entradateclado
    
    fun retornarInt(mensaje: String): Int {
        print(mensaje)
        return readln().toInt()
    }
    
    fun retornarDouble(mensaje: String): Double {
        print(mensaje)
        return readln().toDouble()
    }
    
    fun retornarFloat(mensaje: String): Float {
        print(mensaje)
        return readln().toFloat()
    }
    
    En el programa principal (Principal.tk) importar el paquete entradateclado y llamar a varias de sus funciones.
Solución
Proyecto191

entrada.kt

package entradateclado

fun retornarInt(mensaje: String): Int {
    print(mensaje)
    return readln().toInt()
}

fun retornarDouble(mensaje: String): Double {
    print(mensaje)
    return readln().toDouble()
}

fun retornarFloat(mensaje: String): Float {
    print(mensaje)
    return readln().toFloat()
}



Principal.kt

import entradateclado.*

fun main(args: Array<String>) {
    val numero1 = retornarInt("Ingrese primer valor:")
    val numero2 = retornarInt("Ingrese segundo valor")
    println("La suma es ${numero1 + numero2}")
}