Tracks
/
F#
F#
/
Ejercicios
/
Verificador de contraseñas
Verificador de contraseñas

Verificador 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, la razón 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 caso de fallo

El tipo Result también es 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 dado), y el valor Error también es 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 de 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 garantizar que cumple con un conjunto 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. Para el caso de éxito, el Result debe comunicar la contraseña validada como un string. Para el caso de fallo, el Result debe comunicar la regla que se violó en ese caso.

Note

Para este ejercicio, el verificador de contraseñas será simplista: solo indicará cuándo se ha violado una única regla. Un ejercicio posterior explorará un verificador de contraseñas más realista que pueda indicar cuándo se han violado varias reglas a la vez.

1. Implementa la función checkPassword

La función checkPassword verifica la contraseña dada contra las reglas mencionadas. En caso de fallo, indica la regla que se violó encapsulando uno de los valores de PasswordRule dentro del valor del resultado.

checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter

2. Implementa la ``getStatusMessage` función

La función getStatusMessage devuelve un string que contiene un mensaje legible para humanos que 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 una pestaña nuevas
F# Exercism

¿Todo listo para empezar Verificador de contraseñas?

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