Треки
/
F#
F#
/
Вправи
/
Перевірка пароля
Перевірка пароля

Перевірка пароля

Навчальна вправа

Вступ

Тип Result дає функції змогу повернути єдине значення, яке вказує на все перелічене нижче:

  • Чи завершилася операція успішно чи зазнала невдачі
  • Отримане значення операції в разі успіху
  • Причину невдачі в разі помилки

Використання

Тип Result - узагальнений тип, який містить два внутрішні типи:

  • Тип отриманого значення в разі успішної операції
  • Тип помилки в разі невдачі

Тип Result - також [дискриміноване обʼєднання][discriminated-union] із такими можливими випадками:

  • Ok <value> позначає успішний результат
  • Error <reason> позначає невдачу

Наступна функція демонструє, як створити значення типу Result:

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

У цьому прикладі значення Ok - це рядок тексту (англ. string), а саме передане імʼя, а значення Error теж є рядком тексту (причина помилки, у зрозумілій людині формі).

Читання вмісту значення Result

Розгляньмо таке визначення типу та сигнатуру функції:

type FileOpenError = 
| NotFound
| AccessDenied
| FileLocked

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

Код, який викликає функцію openFile, може використати зіставлення зі зразком, щоб опрацювати випадки успіху й невдачі, як у наступному прикладі:

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

Вказівки

Ваше завдання - створити перевіряльник паролів. Перевіряльник паролів перевіряє запропонований користувачем пароль, щоб переконатися, що він відповідає набору вимог, визначених організацією, яка контролює доступ до відповідного ресурсу.

У цій вправі вимоги до пароля такі:

  • Має містити 12 або більше символів
  • Має містити принаймні одну велику літеру
  • Має містити принаймні одну малу літеру
  • Має містити принаймні одну цифру
  • Має містити принаймні один символ із набору !@#$%^&*

Використайте Result у своєму рішенні, щоб інкапсулювати статус успіху або невдачі. У разі успіху Result має містити перевірений пароль як рядок тексту (англ. string). У разі невдачі Result має містити правило, яке було порушено.

Note

У цій вправі перевіряльник паролів буде спрощеним: він повідомлятиме лише про одне порушене правило. У наступній вправі ми розглянемо реалістичніший перевіряльник паролів, який може повідомляти про кілька порушених правил одночасно.

1. Реалізуйте функцію checkPassword

Функція checkPassword перевіряє заданий пароль на відповідність згаданим правилам. У разі невдачі вона вказує правило, яке було порушено, інкапсулюючи одне зі значень PasswordRule у значенні результату.

checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter

2. Реалізуйте функцію ``getStatusMessage`

Функція getStatusMessage повертає рядок тексту зі зрозумілим для людини повідомленням, яке пояснює значення результату, поверненого з checkPassword.

getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
F# Exercism

Час розпочати Перевірка пароля?

Зареєструйтеся на Exercism, щоб вивчати й опановувати F#, а також 18 концепцій148 вправ та справжнє наставництво від людей, і все це безкоштовно.