Διαδρομές
/
Elm
Elm
/
Ύλη
/
Αδιαφανείς τύποι
Αδ

Αδιαφανείς τύποι σε Elm

2 ασκήσεις

Σχετικά με την έννοια Αδιαφανείς τύποι

Εισαγωγή

Οι αδιαφανείς τύποι είναι μια τεχνική ενθυλάκωσης στην Elm. Μερικοί την αποκαλούν επίσης απόκρυψη πληροφορίας ή απόκρυψη λεπτομερειών υλοποίησης. Χρησιμοποιούνται επίσης συχνά για την επιβολή επικύρωσης, με το μοτίβο Ανάλυσε, μην επικυρώνεις. Για παράδειγμα, θα μπορούσες να έχεις έναν αδιαφανή τύπο EmailAddress, που μπορεί να περιέχει μόνο έγκυρες διευθύνσεις email (σε αντίθεση με μια String, που μπορεί να περιέχει οτιδήποτε).

Δημιουργία ενός Αδιαφανούς Τύπου

Οι προσαρμοσμένοι τύποι έχουν μία ή περισσότερες παραλλαγές, και ο μεταγλωττιστής δημιουργεί αυτόματα μια συνάρτηση για τη δημιουργία κάθε παραλλαγής, χρησιμοποιώντας το όνομα της παραλλαγής. Αυτός είναι ο μόνος τρόπος με τον οποίο μπορούν να δημιουργηθούν προσαρμοσμένοι τύποι. Ο μεταγλωττιστής επιτρέπει επίσης την αποδόμηση αυτών των παραλλαγών.

type Maybe a
    = Nothing --> Variant implies a 'Nothing' function, with type 'Maybe a', and destructuring of 'Nothing'
    | Just a  --> Variant implies a 'Just' function, with type 'a -> Maybe a', and destructuring of 'Just _'

Από προεπιλογή, όλα αυτά είναι εσωτερικά στο αρχείο / άρθρωμα, και χρησιμοποιούμε τη λέξη-κλειδί exposing για να επιλέξουμε τι θα εξάγουμε. Το άρθρωμα Maybe εκθέτει τον τύπο Maybe (ώστε άλλα αρθρώματα να μπορούν να χρησιμοποιούν υπάρχουσες τιμές Maybe), και επίσης εκθέτει τις παραλλαγές Nothing και Just (ώστε άλλα αρθρώματα να μπορούν να δημιουργούν και να αποδομούν τιμές Maybe). Χρησιμοποιεί την παρακάτω σύνταξη για να το κάνει αυτό. Το τμήμα Maybe(..) λέει στην Elm να εκθέσει όλες τις παραλλαγές, καθώς και τον ορισμό του προσαρμοσμένου τύπου.

module Maybe exposing
  ( Maybe(..)
  -- ...
  )

Για να δημιουργήσεις έναν αδιαφανή τύπο, απλώς επιλέγεις να μην εξάγεις τις παραλλαγές. Για να το κάνεις αυτό για τον τύπο Maybe, θα χρησιμοποιούσες την παρακάτω σύνταξη:

module Maybe exposing
  ( Maybe
  -- ...
  )

Όταν το κάνεις αυτό, σχεδόν πάντα χρειάζεται να παρέχεις έναν άλλο τρόπο για τη δημιουργία και τη λήψη των παραλλαγών, εκθέτοντας προσαρμοσμένες συναρτήσεις. Αυτές οι προσαρμοσμένες συναρτήσεις σου επιτρέπουν να εφαρμόζεις κάποια λογική κατά τη δημιουργία και τη λήψη των παραλλαγών. Αυτό κρύβει τις εσωτερικές λεπτομέρειες υλοποίησης του αρθρώματος και σημαίνει ότι μπορείς να αλλάξεις τις λεπτομέρειες υλοποίησης όσο θέλεις, αρκεί οι εκτεθειμένες συναρτήσεις να παραμένουν ίδιες. Σου επιτρέπει επίσης να διατηρείς αναλλοίωτα κατά τη δημιουργία και τη χρήση του τύπου.

Ανάλυσε, μην επικυρώνεις

Ίσως η πιο συνηθισμένη χρήση των αδιαφανών τύπων είναι η επιβολή επικύρωσης, με το μοτίβο Ανάλυσε, μην επικυρώνεις. Σε αυτό το μοτίβο, εκθέτεις μια συνάρτηση που παίρνει ως είσοδο κάτι με λιγότερη δομή / ασφάλεια τύπων από αυτήν που θέλεις, όπως μια String, και μετά το αναλύεις σε έναν πιο δομημένο τύπο, όπως EmailAddress, επιστρέφοντας είτε τον τύπο είτε ένα σφάλμα (συνήθως Maybe ή Result).

Για παράδειγμα, στον παρακάτω κώδικα, τα εξωτερικά αρθρώματα μπορούν να δημιουργήσουν έναν τύπο EmailAddress μόνο μέσω της συνάρτησης parseEmailAddress, οπότε όταν δουλεύεις με τον τύπο EmailAddress, είσαι σίγουρος ότι είναι έγκυρος.

module EmailAddress exposing ( EmailAddress, parseEmailAddress, getEmailAddress )

-- The `EmailAddress` custom type has one variant, also called `EmailAddress`
-- When a custom type has one variant, it is idiomatic to use the same name for both.
type EmailAddress = 
  EmailAddress String

-- create an EmailAddress variant
parseEmailAddress: String -> Maybe EmailAddress
parseEmailAddress candidateEmailAddress =   
  if isValidEmailAddress candidateEmailAddress then
    Just (EmailAddress candidateEmailAddress)
  else
    Nothing

-- get an EmailAddress variant
getEmailAddress: EmailAddress -> String
getEmailAddress ( EmailAddress  emailAdress ) =
  emailAdress

isValidEmailAddress: String -> bool
-- ... 
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Αδιαφανείς τύποι

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 1 ακόμη άσκηση για να εξασκηθείς στην έννοια Αδιαφανείς τύποι