Elixir 1.7 - Naming

नामकरण की परंपरा




elixir

नामकरण की परंपरा

इस दस्तावेज़ में Elixir कोड में कुछ नामकरण सम्मेलनों को कवर किया गया है, जिसमें आवरण से विराम चिह्न वर्ण तक हैं।

झलार

चर, फ़ंक्शन नाम, मॉड्यूल विशेषताएँ आदि को परिभाषित करते समय अमृत डेवलपर्स को snake_case उपयोग करना चाहिए:

some_map = %{this_is_a_key: "and a value"}
is_map(some_map)

उपनाम, जिन्हें आमतौर पर मॉड्यूल नामों के रूप में उपयोग किया जाता है, एक अपवाद हैं क्योंकि उन्हें OptionParser में कैपिटल और लिखित होना चाहिए। उपनामों के लिए, कैपिटल अक्षरों को ExUnit.CaptureIO , ExUnit.CaptureIO या Mix.SCM ExUnit.CaptureIO जैसे ExUnit.CaptureIO में रखा जाता है।

परमाणुओं में या तो लिखा जा सकता है :snake_case या :snake_case , हालांकि सम्मेलन में पूरे अमृत क्षेत्र में साँप के मामले का उपयोग करना है।

आम तौर पर, फ़ाइल नाम से परिभाषित मॉड्यूल के snake_case सम्मेलन का पालन किया snake_case । उदाहरण के लिए, MyApp को my_app.ex फ़ाइल के अंदर परिभाषित किया जाना चाहिए। हालाँकि, यह केवल एक सम्मेलन है। दिन के अंत में, किसी भी फ़ाइल नाम का उपयोग किया जा सकता है क्योंकि वे किसी भी तरह से संकलित कोड को प्रभावित नहीं करते हैं।

अंडरस्कोर ( _foo )

अमृत ​​विभिन्न परिस्थितियों में अंडरस्कोर पर निर्भर करता है।

उदाहरण के लिए, एक मूल्य जिसका उपयोग नहीं किया जाना चाहिए उसे _ या किसी अंडरस्कोर से शुरू होने वाले चर को सौंपा जाना चाहिए:

iex> {:ok, _contents} = File.read("README.md")

समारोह के नाम भी अंडरस्कोर के साथ शुरू हो सकते हैं। ऐसे कार्यों को कभी भी डिफ़ॉल्ट रूप से आयात नहीं किया जाता है:

iex> defmodule Example do
...>   def _wont_be_imported do
...>     :oops
...>   end
...> end

iex> import Example
iex> _wont_be_imported()
** (CompileError) iex:1: undefined function _wont_be_imported/0

इस संपत्ति के कारण, एलिक्सिर मॉड्यूल पर संकलन-समय मेटाडेटा संलग्न करने के लिए अंडरस्कोर के साथ शुरू होने वाले कार्यों पर निर्भर करता है। इस तरह के कार्य अक्सर __foo__ प्रारूप में होते हैं। उदाहरण के लिए, __info__/1 में प्रत्येक मॉड्यूल में एक __info__/1 फ़ंक्शन है:

iex> String.__info__(:functions)
[at: 2, capitalize: 1, chunk: 2, ...]

अमृत ​​में पांच विशेष रूप भी शामिल हैं जो दोहरे अंडरस्कोर प्रारूप का अनुसरण करते हैं: __CALLER__/0 , __DIR__/0 , __ENV__/0 और __MODULE__/0 वर्तमान परिवेश के बारे में संकलन-समय की जानकारी प्राप्त करते हैं, जबकि __STACKTRACE__/0 वर्तमान में __STACKTRACE__/0 को __STACKTRACE__/0 प्राप्त करता है।

अनुगामी बैंग ( foo! )

अनुगामी धमाका (विस्मयादिबोधक चिह्न) एक फ़ंक्शन या मैक्रो को दर्शाता है जहां विफलता के मामले एक अपवाद को बढ़ाते हैं।

कई फ़ंक्शंस जोड़े में आते हैं, जैसे कि File.read/1 और File.read!/1 File.read/1 एक सफलता या असफलता File.read!/1 , जबकि File.read!/1 एक सादा मान लौटाएगा या फिर कोई अन्य शुल्क देगा:

iex> File.read("file.txt")
{:ok, "file contents"}
iex> File.read("no_such_file.txt")
{:error, :enoent}

iex> File.read!("file.txt")
"file contents"
iex> File.read!("no_such_file.txt")
** (File.Error) could not read file no_such_file.txt: no such file or directory

बिना संस्करण ! जब आप पैटर्न मिलान का उपयोग करके विभिन्न परिणामों को संभालना चाहते हैं तो प्राथमिकता दी जाती है:

case File.read(file) do
  {:ok, body}      -> # do something with the `body`
  {:error, reason} -> # handle the error caused by `reason`
end

हालाँकि, यदि आप परिणाम के हमेशा सफल होने की उम्मीद करते हैं (जैसे कि यदि आप हमेशा फ़ाइल के अस्तित्व में रहने की उम्मीद करते हैं), तो धमाके की भिन्नता अधिक सुविधाजनक हो सकती है और विफलता पर एक अधिक उपयोगी त्रुटि संदेश (विफल पैटर्न मैच की तुलना में) बढ़ाएगा।

युग्मित कार्यों के और उदाहरण: Base.decode16/2 और Base.decode16!/2 , File.cwd/0 और File.cwd!/0

कुछ गैर-युग्मित कार्य भी हैं, जिनमें कोई गैर-बैंग संस्करण नहीं है। धमाका अभी भी दर्शाता है कि यह विफलता पर एक अपवाद को बढ़ाएगा। उदाहरण: Mix.Config.validate!/1 , Protocol.assert_protocol!/1

मैक्रो कोड में, Kernel.alias!/1 और Kernel.var!/2 पर धमाका दर्शाता है कि मैक्रो हाइजीन अलग सेट है।

अनुगामी प्रश्न चिह्न ( foo? )

एक बूलियन को लौटाने वाले कार्यों को एक अनुगामी प्रश्न चिह्न के साथ नाम दिया गया है।

उदाहरण: Keyword.keyword?/1 , Mix.debug?/0 , String.contains?/2

हालांकि, ऐसे कार्य जो बूलियनों को वापस कर देते हैं और गार्ड में मान्य होते हैं, एक और सम्मेलन का अनुसरण करते हैं, जो अगले वर्णित है।

is_foo उपसर्ग ( is_foo )

टाइप चेक और अन्य बूलियन चेक जिन्हें गार्ड क्लॉज में अनुमति दी जाती है, उन्हें is_ उपसर्ग के साथ नामित किया जाता है।

उदाहरण: Integer.is_even/1 , Kernel.is_list/1

ये फ़ंक्शन और मैक्रोज़ एक अनुगामी प्रश्न चिह्न के बजाय एक is_ उपसर्ग के Erlang सम्मेलन का पालन करते हैं, ठीक से इंगित करने के लिए कि उन्हें गार्ड क्लॉज़ में अनुमति दी गई है।

ध्यान दें कि प्रकार के चेक जो गार्ड क्लॉज में मान्य नहीं हैं वे इस सम्मेलन का पालन नहीं करते हैं। उदाहरण: Keyword.keyword?/1 , Regex.regex?/1

विशेष नाम

कुछ नामों का विशिष्ट अर्थ अमृत है। हम नीचे उन मामलों को विस्तार से बताते हैं।

लंबाई और आकार

जब आप किसी फ़ंक्शन नाम में size देखते हैं, तो इसका मतलब है कि ऑपरेशन निरंतर समय में चलता है (इसे "O (1) समय" भी कहा जाता है) क्योंकि आकार डेटा संरचना के साथ संग्रहीत होता है।

उदाहरण: Kernel.map_size/1 , Kernel.tuple_size/1

जब आप length देखते हैं, तो ऑपरेशन रैखिक समय ("O (n) समय") में चलता है क्योंकि संपूर्ण डेटा संरचना का पता लगाना होता है।

उदाहरण: Kernel.length/1 , String.length/1

दूसरे शब्दों में, इसके नाम में "आकार" शब्द का उपयोग करने वाले फ़ंक्शन को उसी समय लगेगा, जब डेटा संरचना छोटी या बड़ी हो। इसके विपरीत, इसके नाम में "लंबाई" वाले कार्यों को अधिक समय लगेगा क्योंकि डेटा संरचना आकार में बढ़ती है।