Elixir में डॉक्युमेंटेशन को कोड जितना ही महत्व दिया जाता है।
आपके कोड को डॉक्युमेंट करने के लिए आम तौर पर दो मॉड्यूल एट्रिब्यूट इस्तेमाल होते हैं - @moduledoc किसी मॉड्यूल को डॉक्युमेंट करने के लिए और @doc उस एट्रिब्यूट के बाद आने वाले फंक्शन को डॉक्युमेंट करने के लिए। @moduledoc एट्रिब्यूट आम तौर पर मॉड्यूल की पहली लाइन पर आता है, और @doc एट्रिब्यूट आम तौर पर किसी फंक्शन की परिभाषा से ठीक पहले आता है, या फंक्शन के टाइपस्पेक से पहले, अगर उसका कोई टाइपस्पेक हो। डॉक्युमेंटेशन आम तौर पर हेरडॉक सिंटैक्स का उपयोग करके एक मल्टीलाइन स्ट्रिंग में लिखा जाता है।
Elixir का डॉक्युमेंटेशन Markdown में लिखा जाता है।
defmodule String do
@moduledoc """
Strings in Elixir are UTF-8 encoded binaries.
"""
@doc """
Converts all characters in the given string to uppercase according to `mode`.
## Examples
iex> String.upcase("abcd")
"ABCD"
iex> String.upcase("olá")
"OLÁ"
"""
def upcase(string, mode \\ :default)
end
Elixir एक डायनामिक टाइप वाली भाषा है, जिसका मतलब है कि यह कंपाइल-टाइम टाइप जाँच प्रदान नहीं करती। फिर भी, टाइप स्पेसिफिकेशन का उपयोग डॉक्युमेंटेशन के एक रूप के तौर पर किया जा सकता है।
@spec मॉड्यूल एट्रिब्यूट का उपयोग करके किसी फंक्शन में फंक्शन की परिभाषा से ठीक पहले टाइप स्पेसिफिकेशन जोड़ा जा सकता है। @spec के बाद फंक्शन का नाम और उसके सभी आर्गुमेंट के टाइप की सूची ब्रैकेट में, कॉमा से अलग किए हुए आती है। रिटर्न वैल्यू का टाइप फंक्शन के आर्गुमेंट से डबल कोलन :: से अलग किया जाता है।
@spec longer_than?(String.t(), non_neg_integer()) :: boolean()
def longer_than?(string, length), do: String.length(string) > length
सबसे आम तौर पर इस्तेमाल होने वाले टाइप में शामिल हैं:
boolean()
String.t()
integer(), non_neg_integer(), pos_integer(), float()
list()
any()
कुछ टाइप को पैरामीटराइज़ भी किया जा सकता है, उदाहरण के लिए list(integer) पूर्णांकों का ऐरे है।
लिटरल वैल्यू को भी टाइप के रूप में इस्तेमाल किया जा सकता है।
टाइपों के यूनियन को पाइप | का उपयोग करके लिखा जा सकता है। उदाहरण के लिए, integer() | :error का मतलब है या तो एक पूर्णांक या एटम लिटरल :error।
सभी टाइप की पूरी सूची आधिकारिक डॉक्युमेंटेशन में "Typespecs" सेक्शन में मिल सकती है।
टाइपस्पेक में आर्गुमेंट के नाम भी रखे जा सकते हैं, जो एक ही टाइप के कई आर्गुमेंट को अलग-अलग पहचानने में उपयोगी होता है। आर्गुमेंट का नाम, उसके बाद डबल कोलन, आर्गुमेंट के टाइप से पहले आता है।
@spec to_hex({hue :: integer, saturation :: integer, lightness :: integer}) :: String.t()
टाइपस्पेक केवल बिल्ट-इन टाइप तक सीमित नहीं हैं। @type मॉड्यूल एट्रिब्यूट का उपयोग करके कस्टम टाइप बनाए जा सकते हैं। कस्टम टाइप की परिभाषा टाइप के नाम से शुरू होती है, उसके बाद डबल कोलन और फिर टाइप खुद।
@type color :: {hue :: integer, saturation :: integer, lightness :: integer}
@spec to_hex(color()) :: String.t()
कस्टम टाइप का उपयोग उसी मॉड्यूल से किया जा सकता है जहाँ वह परिभाषित है, या किसी दूसरे मॉड्यूल से।
आप कुछ समय से शहर के ऑफिस में काम कर रहे हैं। इस दौरान आपने ऐसे कई टूल बनाए हैं जो आपका रोज़मर्रा का काम तेज़ कर देते हैं, जैसे फॉर्म भरना।
अब आपके साथ एक नया साथी जुड़ रहा है, और आपको लगा कि आपके टूल देखते ही सब कुछ अपने आप समझ में आ जाए, ऐसा ज़रूरी नहीं। आपके ऑफिस में कई अजीब परंपराएँ हैं, जैसे फॉर्म हमेशा बड़े अक्षरों में भरना और किसी फील्ड को खाली न छोड़ना।
आप तय करते हैं कि आप थोड़ा डॉक्युमेंटेशन लिखेंगे, ताकि आपके नए साथी के लिए तुरंत शुरू करना और आपके टूल इस्तेमाल करना आसान हो जाए।
Form मॉड्यूल में ऐसा डॉक्युमेंटेशन जोड़िए जिसमें उसका उद्देश्य बताया गया हो। उसमें यह लिखा होना चाहिए:
A collection of loosely related functions helpful for filling out various forms at the city office.
Form.blanks/1 फंक्शन में डॉक्युमेंटेशन और एक टाइपस्पेक जोड़िए। डॉक्युमेंटेशन में यह लिखा होना चाहिए:
Generates a string of a given length.
This string can be used to fill out a form field that is supposed to have no value.
Such fields cannot be left empty because a malicious third party could fill them out with false data.
टाइपस्पेक से यह साफ होना चाहिए कि यह फंक्शन एक ही आर्गुमेंट लेता है, जो ऋणात्मक न होने वाला पूर्णांक है, और एक स्ट्रिंग लौटाता है।
Form.letters/1 फंक्शन में डॉक्युमेंटेशन और एक टाइपस्पेक जोड़िए। डॉक्युमेंटेशन में यह लिखा होना चाहिए:
Splits the string into a list of uppercase letters.
This is needed for form fields that don't offer a single input for the whole string,
but instead require splitting the string into a predefined number of single-letter inputs.
टाइपस्पेक से यह साफ होना चाहिए कि यह फंक्शन एक ही आर्गुमेंट लेता है, जो एक स्ट्रिंग है, और स्ट्रिंग का ऐरे लौटाता है।
Form.check_length/2 फंक्शन में डॉक्युमेंटेशन और एक टाइपस्पेक जोड़िए। डॉक्युमेंटेशन में यह लिखा होना चाहिए:
Checks if the value has no more than the maximum allowed number of letters.
This is needed to check that the values of fields do not exceed the maximum allowed length.
It also tells you by how much the value exceeds the maximum.
टाइपस्पेक से यह साफ होना चाहिए कि यह फंक्शन दो आर्गुमेंट लेता है, एक स्ट्रिंग और एक ऋणात्मक न होने वाला पूर्णांक, और दो संभावित वैल्यू में से एक लौटाता है। यह या तो :ok एटम लौटाता है या ऐसा 2-टपल लौटाता है जिसका पहला एलिमेंट :error एटम और दूसरा एक धनात्मक पूर्णांक होता है।
किसी ऐसे कारण से, जो आपको नहीं पता, शहर के ऑफिस का अंदरूनी सिस्टम पता दिखाने के दो अलग-अलग तरीके इस्तेमाल करता है, कभी मैप के रूप में और कभी टपल के रूप में।
तीन कस्टम पब्लिक टाइप बनाकर इस बात का डॉक्युमेंटेशन कीजिए:
address_map - एक मैप जिसमें :street, :postal_code और :city की होती हैं। हर की के अंदर स्ट्रिंग टाइप की वैल्यू रखी जाती है।address_tuple - तीन वैल्यू वाला टपल: street, postal_code और city। हर वैल्यू स्ट्रिंग टाइप की होती है। टाइपस्पेक में इन वैल्यू को नाम दीजिए, जिससे वे एक-दूसरे से अलग पहचानी जाएँ।address - यह address_map या address_tuple, दोनों में से कोई भी हो सकता है।Form.format_address/1 फंक्शन में डॉक्युमेंटेशन और एक टाइपस्पेक जोड़िए। डॉक्युमेंटेशन में यह लिखा होना चाहिए:
Formats the address as an uppercase multiline string.
टाइपस्पेक से यह साफ होना चाहिए कि यह फंक्शन एक आर्गुमेंट लेता है, एक पता, और एक स्ट्रिंग लौटाता है।
Exercism पर साइन अप कीजिए और Elixir को 58 कॉन्सेप्ट168 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।