مسیرها
/
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 یک رشته است (اسم داده‌شده) و مقدار 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."

دستورالعمل‌ها

وظیفه‌ی شما ساختن یک بررسی‌کننده‌ی رمز عبور است. بررسی‌کننده‌ی رمز عبور، رمز عبور پیشنهادی کاربر را اعتبارسنجی می‌کند تا مطمئن شود که آن رمز مجموعه الزاماتی را برآورده می‌کند که سازمان کنترل‌کننده‌ی دسترسی به منبع موردنظر تعریف کرده است.

برای این تمرین، الزامات رمز عبور عبارت‌اند از:

  • باید ۱۲ کاراکتر یا بیشتر داشته باشد
  • باید حداقل یک حرف بزرگ داشته باشد
  • باید حداقل یک حرف کوچک داشته باشد
  • باید حداقل یک رقم داشته باشد
  • باید حداقل یک نماد از مجموعه‌ی !@#$%^&* داشته باشد

راه‌حل شما باید از یک Result برای کپسوله‌کردن وضعیت موفقیت یا شکست استفاده کند. در حالت موفقیت، Result باید رمز عبور اعتبارسنجی‌شده را به‌صورت یک رشته منتقل کند. در حالت شکست، 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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.