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ónlet
.
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.