المسارات
/
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."

التعليمات

مهمتك هي إنشاء مدقّق لكلمات المرور. يتحقق مدقّق كلمات المرور من كلمة المرور المقترحة من المستخدم ليتأكد من أنها تستوفي مجموعة من المتطلبات التي تحددها المؤسسة التي تتحكم في الوصول إلى المورد المعني.

في هذا التمرين، متطلبات كلمة المرور هي:

  • يجب أن تحتوي على 12 حرفًا أو أكثر
  • يجب أن تحتوي على حرف كبير واحد على الأقل
  • يجب أن تحتوي على حرف صغير واحد على الأقل
  • يجب أن تحتوي على رقم واحد على الأقل
  • يجب أن تحتوي على رمز واحد على الأقل من المجموعة !@#$%^&*

يجب أن يستخدم حلك نوع 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.