Διαδρομές
/
F#
F#
/
Ασκήσεις
/
Έλεγχος κωδικού πρόσβασης
Έλεγχος κωδικού πρόσβασης

Έλεγχος κωδικού πρόσβασης

Άσκηση εκμάθησης

Εισαγωγή

Ο τύπος Result δίνει τη δυνατότητα σε μια συνάρτηση να επιστρέφει μία μόνο τιμή που δηλώνει όλα τα παρακάτω:

  • Αν η πράξη πέτυχε ή απέτυχε
  • Σε περίπτωση επιτυχίας, την τιμή που προκύπτει από την πράξη
  • Σε περίπτωση αποτυχίας, τον λόγο της αποτυχίας

Χρήση

Ο τύπος Result είναι ένας γενικός τύπος που περιέχει δύο υποκείμενους τύπους:

  • Τον τύπο της τιμής που προκύπτει από μια επιτυχημένη πράξη
  • Τον τύπο του σφάλματος σε περίπτωση αποτυχίας

Ο τύπος Result είναι επίσης μια [discriminated union][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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.