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 অ্যাটম, নয়তো একটি ২-টাপল রিটার্ন করে, যার প্রথম এলিমেন্ট :error অ্যাটম আর দ্বিতীয়টি একটি ধনাত্মক ইন্টিজার।
আপনার অজানা কোনো এক কারণে, সিটি অফিসের অভ্যন্তরীণ সিস্টেম অ্যাড্রেস উপস্থাপনের দুটি ভিন্ন পদ্ধতি ব্যবহার করে, হয় একটি ম্যাপ হিসেবে, নয়তো একটি টাপল হিসেবে।
তিনটি কাস্টম পাবলিক টাইপ ডিফাইন করে এই বিষয়টি ডকুমেন্ট করুন:
address_map - একটি ম্যাপ, যার কী (key)গুলো হলো :street, :postal_code আর :city. প্রতিটি কী (key) স্ট্রিং টাইপের একটি মান ধারণ করে।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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।