Rutas
/
F#
F#
/
Ejercicios
/
Comprobador de contraseñas
Comprobador de contraseñas

Comprobador de contraseñas

Ejercicio de aprendizaje

Introducción

El tipo Result permite que una función devuelva un único valor que indique todas las siguientes cosas:

  • Si la operación tuvo éxito o falló
  • En caso de éxito, el valor resultante de la operación
  • En caso de fallo, el motivo del fallo

Uso

El tipo Result es un tipo genérico que contiene dos tipos subyacentes:

  • El tipo del valor resultante en una operación exitosa
  • El tipo de error en un fallo

El tipo Result es también una [unión discriminada][discriminated-union] con los siguientes casos posibles:

  • Ok <value> que representa un resultado exitoso
  • Error <reason> que representa un fallo

La siguiente función demuestra cómo crear un valor Result:

let validateName (name: string) : Result<string, string> = 
    match name with
    | null -> Error "Name not found."
    | "" -> Error "Name is empty."
    | _ -> Ok name

En este ejemplo, el valor Ok es un string (el nombre proporcionado), y el valor Error es también un string (la causa del error, en formato legible para humanos).

Leer el contenido de un valor Result

Considera la siguiente definición de tipo y firma de función:

type FileOpenError = 
| NotFound
| AccessDenied
| FileLocked

let openFile (filename: string) : Result<int, FileOpenError> =

El código que llama a la función openFile puede usar la coincidencia de patrones para manejar los casos de éxito y fallo, como en el siguiente ejemplo:

match openFile(filename) with
| Ok handle -> doSomethingWithFile(handle)
| Error NotFound -> printfn $"Error: file {filename} was not found."
| Error AccessDenied -> printfn $"Error: you do not have permission to open the file {filename}."
| Error FileLocked -> printfn $"Error: file {filename} is already in use."

Instrucciones

Tu tarea es crear un verificador de contraseñas. Un verificador de contraseñas valida la contraseña propuesta por un usuario para asegurarse de que cumple una serie de requisitos definidos por la organización que controla el acceso al recurso en cuestión.

Para este ejercicio, los requisitos de la contraseña son:

  • Debe tener 12 caracteres o más
  • Debe tener al menos una letra mayúscula
  • Debe tener al menos una letra minúscula
  • Debe tener al menos un dígito
  • Debe tener al menos un símbolo del conjunto !@#$%^&*

Tu solución debe usar un Result para encapsular el estado de éxito o de fallo. En el caso de éxito, el Result debe contener la contraseña validada como string. En el caso de fallo, el Result debe contener la regla que se ha incumplido.

Note

Para este ejercicio, el verificador de contraseñas será muy simple: solo indicará cuándo se ha incumplido una única regla. En un ejercicio posterior veremos un verificador de contraseñas más realista, capaz de indicar cuándo se han incumplido varias reglas a la vez.

1. Implementa la función checkPassword

La función checkPassword comprueba la contraseña dada con los requisitos mencionados. Si falla, indica la regla que se ha incumplido encapsulando uno de los valores de PasswordRule dentro del valor del resultado.

checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter

2. Implementa la función ``getStatusMessage`

La función getStatusMessage devuelve un string que contiene un mensaje legible para las personas e indica el significado del resultado devuelto por checkPassword.

getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
F# Exercism

¿Listo para empezar Comprobador de contraseñas?

Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.