ओपेक टाइप, Elm में एनकैप्सुलेशन की एक तकनीक है।
कुछ लोग इसे जानकारी छिपाना, या इम्प्लीमेंटेशन के ब्यौरे छिपाना भी कहते हैं।
इनका इस्तेमाल आमतौर पर वैलिडेशन लागू करने के लिए भी किया जाता है, और इसके लिए पार्स कीजिए, वैलिडेट नहीं पैटर्न अपनाया जाता है।
उदाहरण के लिए, आपके पास एक EmailAddress ओपेक टाइप हो सकता है, जिसमें सिर्फ मान्य ईमेल पते ही रखे जा सकते हैं (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 कीवर्ड का इस्तेमाल करते हैं।
ओपेक टाइप बनाने के लिए, आप बस वेरिएंट को एक्सपोर्ट न करने का फैसला करते हैं।
ऐसा करने पर आपको लगभग हमेशा वेरिएंट बनाने और पाने का कोई और तरीका देना पड़ता है, यानी कुछ कस्टम फंक्शन एक्सपोज़ करने पड़ते हैं। ये कस्टम फंक्शन आपको वेरिएंट बनाते और पाते समय कुछ लॉजिक लगाने देते हैं। इससे मॉड्यूल के अंदरूनी इम्प्लीमेंटेशन का ब्यौरा छिप जाता है, और इसका मतलब है कि आप इम्प्लीमेंटेशन का ब्यौरा जितना चाहें बदल सकते हैं, बशर्ते एक्सपोज़ किए गए फंक्शन वही रहें।
ओपेक टाइप का सबसे आम इस्तेमाल शायद वैलिडेशन लागू करना है, और इसके लिए पार्स कीजिए, वैलिडेट नहीं पैटर्न अपनाया जाता है।
इस पैटर्न में आप एक ऐसा फंक्शन एक्सपोज़ करते हैं जो ऐसा इनपुट लेता है जिसमें आप जितना ढाँचा और टाइप सुरक्षा चाहते हैं उससे कम हो, जैसे कोई 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
-- ...
इस अभ्यास में आप एक जेनेरिक (या जादुई!) SecureTreasureChest लिखने वाले हैं, जिसमें कुछ खज़ाना रखा जाएगा।
तेज़ नज़र वाले छात्रों ने ज़रूर देख लिया होगा कि पिछला TreasureChest उतना सुरक्षित नहीं था!
अगर आप getTreasure फंक्शन इस्तेमाल करते थे, तो आपको पासवर्ड देना पड़ता था, लेकिन फिर भी आप बिना पासवर्ड जाने TreasureChest टाइप को सीधे डीस्ट्रक्चर करके खज़ाना निकाल सकते थे।
और इससे भी बुरी बात, आप उसी तरीके से पासवर्ड भी निकाल सकते थे!
चलिए इसे ओपेक टाइप का उपयोग करके ठीक करते हैं।
एक ही वेरिएंट वाला Password कस्टम टाइप परिभाषित कीजिए।
उस वेरिएंट के साथ एक String वैल्यू जुड़ी होनी चाहिए, जो पासवर्ड के लिए हो।
आपको Password टाइप एक्सपोज़ करना चाहिए, लेकिन वेरिएंट नहीं।
इससे Password एक ओपेक टाइप बन जाता है, और इसका मतलब है कि अब आप पासवर्ड निकालने के लिए डीस्ट्रक्चरिंग का उपयोग नहीं कर सकते।
यह जाँचना संभव नहीं है कि कोई टाइप ओपेक है या नहीं। प्रोडक्शन कोड में आप इसे लागू करवाने के लिए elm-review (एक स्टैटिक एनालिसिस टूल) का उपयोग करेंगे।
एक createPassword फंक्शन बनाइए और उसे एक्सपोज़ कीजिए, टाइप डेफिनिशन के साथ, जो एक String लेता है और एक Maybe Password लौटाता है।
Owasp की सलाह है कि पासवर्ड कम से कम 8 अक्षरों के होने चाहिए, इसलिए चलिए इस शर्त को लागू करने के लिए Parse, don't validate पैटर्न का उपयोग करते हैं।
अगर पासवर्ड 8 अक्षरों से छोटा है, तो createPassword को Nothing लौटाना चाहिए, वरना उसे Just Password लौटाना चाहिए।
आपको SecureTreasureChest टाइप एक्सपोज़ करना चाहिए, लेकिन वेरिएंट नहीं।
इससे SecureTreasureChest एक ओपेक टाइप बन जाता है, और इसका मतलब है कि अब आप पासवर्ड या खज़ाना निकालने के लिए डीस्ट्रक्चरिंग का उपयोग नहीं कर सकते।
इस फंक्शन को दो पैरामीटर लेने चाहिए, और इसके साथ एक टाइप डेफिनिशन होनी चाहिए।
Password (पासवर्ड के लिए)फंक्शन को एक SecureTreasureChest लौटाना चाहिए।
इस फंक्शन को एक्सपोज़ कीजिए, ताकि दूसरे मॉड्यूल SecureTreasureChest के इंस्टेंस बना सकें।
इस फंक्शन को दो पैरामीटर लेने चाहिए, और इसके साथ एक टाइप डेफिनिशन होनी चाहिए।
String (पासवर्ड के लिए)SecureTreasureChest जेनेरिक कस्टम टाइपइस फंक्शन को दिए गए पासवर्ड की तुलना SecureTreasureChest में मौजूद Password से करनी चाहिए।
फंक्शन को एक Maybe लौटाना चाहिए।
अगर पासवर्ड मेल खाते हैं, तो SecureTreasureChest से मिली जेनेरिक वैल्यू (यानी खज़ाना!) के साथ Just लौटाइए।
अगर पासवर्ड मेल नहीं खाते, तो Nothing लौटाइए।
इस फंक्शन को एक्सपोज़ कीजिए, ताकि दूसरे मॉड्यूल, सही पासवर्ड देने पर, SecureTreasureChest से खज़ाना निकाल सकें।
Exercism पर साइन अप कीजिए और Elm को 28 कॉन्सेप्ट110 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।