Track
/
F#
F#
/
Esercizi
/
Controllo password
Controllo password

Controllo password

Esercizio di apprendimento

Introduzione

Il tipo Result permette a una funzione di restituire un unico valore che indica tutte le cose seguenti:

  • Se l'operazione è riuscita o fallita
  • In caso di successo, il valore risultante dell'operazione
  • In caso di fallimento, il motivo del fallimento

Utilizzo

Il tipo Result è un tipo generico che contiene due tipi sottostanti:

  • Il tipo del valore risultante in caso di operazione riuscita
  • Il tipo di errore in caso di fallimento

Il tipo Result è anche una [unione discriminata][discriminated-union] con i seguenti casi possibili:

  • Ok <value> che rappresenta un risultato riuscito
  • Error <reason> che rappresenta un fallimento

La seguente funzione mostra come creare un valore Result:

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

In questo esempio, il valore Ok è una stringa (il nome fornito) e anche il valore Error è una stringa (la causa dell'errore, in una forma leggibile).

Leggere il contenuto di un valore Result

Considera la seguente definizione di tipo e la firma della funzione:

type FileOpenError = 
| NotFound
| AccessDenied
| FileLocked

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

Il codice che chiama la funzione openFile può usare il pattern matching per gestire i casi di successo e di fallimento, come nell'esempio seguente:

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."

Istruzioni

Il tuo compito è creare un verificatore di password. Un verificatore di password convalida la password proposta da un utente per assicurarsi che soddisfi una serie di requisiti definiti dall'organizzazione che controlla l'accesso alla risorsa in questione.

Per questo esercizio, i requisiti della password sono:

  • Deve avere 12 o più caratteri
  • Deve contenere almeno una lettera maiuscola
  • Deve contenere almeno una lettera minuscola
  • Deve contenere almeno una cifra
  • Deve contenere almeno un simbolo dell'insieme !@#$%^&*

La soluzione deve usare un Result per incapsulare lo stato di successo o di fallimento. Nel caso di successo, il Result deve riportare la password convalidata sotto forma di stringa. Nel caso di fallimento, il Result deve riportare la regola che è stata violata.

Note

Per questo esercizio, il verificatore di password sarà molto semplice: indicherà solo quando è stata violata una singola regola. Un esercizio successivo esplorerà un verificatore di password più realistico, in grado di indicare quando più regole sono state violate contemporaneamente.

1. Implementa la funzione checkPassword

La funzione checkPassword verifica la password data rispetto ai requisiti menzionati sopra. In caso di fallimento, indica la regola violata incapsulando uno dei valori di PasswordRule all'interno del valore risultante.

checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter

2. Implementa la funzione ``getStatusMessage`

La funzione getStatusMessage restituisce una stringa contenente un messaggio leggibile da una persona che indica il significato del risultato restituito da checkPassword.

getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
F# Exercism

Vuoi iniziare Controllo password?

Iscriviti a Exercism per imparare e padroneggiare F# con 18 concetti148 esercizi e il mentoring di persone reali, tutto gratis.