Skip to main content

Tarea 1 - Introducción a Kotlin

Solamente puedes utilizar interfaces, clases abstractas, clases abiertas y cerradas (no puedes utilizar clases selladas, enums, data classes, funciones de extensión, ni ningún otro concepto avanzado de oop). Puedes utilizar conceptos de programación funcional, pero no son necesarios para resolver el ejercicio.

Utiliza ?. y ?: para manejar valores nulos de manera segura. No utilices !! ni hagas chequeos manuales de nulos (por ejemplo, if (x != null)).

P1 [4 pts] Biblioteca para Validación Segura de Formularios

Las bibliotecas permiten reutilizar código y crear software más robusto y mantenible. Un aspecto crítico en la creación de una biblioteca es garantizar una API clara, simple y segura frente a valores nulos, especialmente al validar formularios donde algunos campos podrían no estar presentes.

Tu tarea consiste en desarrollar una pequeña biblioteca en Kotlin llamada FormValidator que permita validar formularios simples de forma segura usando operadores de seguridad ante valores nulos (?., ?:) y la función let. La biblioteca debe:

  • Proporcionar una API simple, clara y concisa.
  • Evitar que lxs usuarixs puedan utilizar la biblioteca incorrectamente.
  • Ocultar detalles internos y ofrecer encapsulación adecuada.

Debes implementar las siguientes funciones en la clase FormValidator:

  • fun addRequiredField(fieldName: String): FormValidator
  • fun addOptionalField(fieldName: String): FormValidator
  • fun validate(form: Map<String, String?>): ValidationResult

La validación debe:

  • Retornar un resultado que indique claramente si la validación fue exitosa o, en caso contrario, listar los campos faltantes o inválidos.
  • Utilizar obligatoriamente una combinación efectiva de los operadores ?., ?:, y la función let.

Formato del resultado:

La clase ValidationResult puede tener la siguiente estructura:

sealed class ValidationResult {
object Success : ValidationResult()
data class Failure(val missingFields: List<String>) : ValidationResult()
}

Ejemplo de uso:

val validator = FormValidator()
.addRequiredField("username")
.addRequiredField("email")
.addOptionalField("phone")

val formData = mapOf(
"username" to "juan",
"email" to null,
"phone" to "123456789"
)

val result = validator.validate(formData)

when (result) {
is ValidationResult.Success -> println("Validación exitosa")
is ValidationResult.Failure -> println("Campos faltantes: ${result.missingFields}")
}

Hints:

  • Usa el operador ?: para establecer valores predeterminados en campos opcionales.
  • Usa la función let para validar valores específicos cuando existan.
  • Emplea el operador ?. para manejar campos potencialmente ausentes de forma segura.

P2 [1 pt] Documentación

Añade documentación clara y concisa para la clase y cada función pública en formato KDoc, explicando brevemente qué hacen y cómo usarlas correctamente.

P3 [1 pt] Validaciones personalizadas

Permite que lxs usuarixs puedan especificar validaciones personalizadas (ejemplo: formato de correo electrónico) para cada campo usando funciones lambda, asegurando siempre la seguridad ante valores nulos.

Hint: Puedes usar una estructura como Map<String, (String) -> Boolean> para almacenar estas validaciones adicionales.