ट्रैक
/
Elm
Elm
/
अभ्यास
/
सुरक्षित खज़ाने का संदूक
सुरक्षित खज़ाने का संदूक

सुरक्षित खज़ाने का संदूक

सीखने का अभ्यास

परिचय

ओपेक टाइप

परिचय

ओपेक टाइप, 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 टाइप को सीधे डीस्ट्रक्चर करके खज़ाना निकाल सकते थे। और इससे भी बुरी बात, आप उसी तरीके से पासवर्ड भी निकाल सकते थे! चलिए इसे ओपेक टाइप का उपयोग करके ठीक करते हैं।

1. "Parse, don't validate" पैटर्न का उपयोग करके Password ओपेक टाइप परिभाषित कीजिए

एक ही वेरिएंट वाला Password कस्टम टाइप परिभाषित कीजिए।

उस वेरिएंट के साथ एक String वैल्यू जुड़ी होनी चाहिए, जो पासवर्ड के लिए हो।

आपको Password टाइप एक्सपोज़ करना चाहिए, लेकिन वेरिएंट नहीं। इससे Password एक ओपेक टाइप बन जाता है, और इसका मतलब है कि अब आप पासवर्ड निकालने के लिए डीस्ट्रक्चरिंग का उपयोग नहीं कर सकते। यह जाँचना संभव नहीं है कि कोई टाइप ओपेक है या नहीं। प्रोडक्शन कोड में आप इसे लागू करवाने के लिए elm-review (एक स्टैटिक एनालिसिस टूल) का उपयोग करेंगे।

एक createPassword फंक्शन बनाइए और उसे एक्सपोज़ कीजिए, टाइप डेफिनिशन के साथ, जो एक String लेता है और एक Maybe Password लौटाता है।

Owasp की सलाह है कि पासवर्ड कम से कम 8 अक्षरों के होने चाहिए, इसलिए चलिए इस शर्त को लागू करने के लिए Parse, don't validate पैटर्न का उपयोग करते हैं।

अगर पासवर्ड 8 अक्षरों से छोटा है, तो createPassword को Nothing लौटाना चाहिए, वरना उसे Just Password लौटाना चाहिए।

2. SecureTreasureChest को एक्सपोज़ कीजिए, लेकिन उसके वेरिएंट को नहीं

आपको SecureTreasureChest टाइप एक्सपोज़ करना चाहिए, लेकिन वेरिएंट नहीं। इससे SecureTreasureChest एक ओपेक टाइप बन जाता है, और इसका मतलब है कि अब आप पासवर्ड या खज़ाना निकालने के लिए डीस्ट्रक्चरिंग का उपयोग नहीं कर सकते।

3. createTreasure फंक्शन बनाइए

इस फंक्शन को दो पैरामीटर लेने चाहिए, और इसके साथ एक टाइप डेफिनिशन होनी चाहिए।

  • एक जेनेरिक टाइप (खज़ाने के लिए)
  • एक Password (पासवर्ड के लिए)

फंक्शन को एक SecureTreasureChest लौटाना चाहिए।

इस फंक्शन को एक्सपोज़ कीजिए, ताकि दूसरे मॉड्यूल SecureTreasureChest के इंस्टेंस बना सकें।

4. getTreasure फंक्शन बनाइए

इस फंक्शन को दो पैरामीटर लेने चाहिए, और इसके साथ एक टाइप डेफिनिशन होनी चाहिए।

  • एक String (पासवर्ड के लिए)
  • एक SecureTreasureChest जेनेरिक कस्टम टाइप

इस फंक्शन को दिए गए पासवर्ड की तुलना SecureTreasureChest में मौजूद Password से करनी चाहिए।

फंक्शन को एक Maybe लौटाना चाहिए।

अगर पासवर्ड मेल खाते हैं, तो SecureTreasureChest से मिली जेनेरिक वैल्यू (यानी खज़ाना!) के साथ Just लौटाइए।

अगर पासवर्ड मेल नहीं खाते, तो Nothing लौटाइए।

इस फंक्शन को एक्सपोज़ कीजिए, ताकि दूसरे मॉड्यूल, सही पासवर्ड देने पर, SecureTreasureChest से खज़ाना निकाल सकें।

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Elm Exercism

सुरक्षित खज़ाने का संदूक शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Elm को 28 कॉन्सेप्ट110 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।