يحتل التوثيق في Elixir مكانة من الدرجة الأولى.
هناك سمتان شائعتان تُستخدمان لتوثيق الكود: @moduledoc لتوثيق الوحدة، و@doc لتوثيق الدالة التي تأتي بعد السمة. تظهر السمة @moduledoc عادةً في السطر الأول من الوحدة، وتظهر السمة @doc عادةً قبل تعريف الدالة مباشرة، أو قبل مواصفات نوع الدالة إن وُجدت. ويُكتب التوثيق عادةً في سلسلة نصية متعددة الأسطر باستخدام صيغة heredoc.
يُكتب توثيق 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.
تجد قائمة كاملة بجميع الأنواع في قسم "مواصفات الأنواع" في التوثيق الرسمي.
يمكن أيضًا تسمية الوسائط في مواصفات الأنواع، وهذا مفيد للتمييز بين وسائط متعددة من النوع نفسه. ويأتي اسم الوسيط، متبوعًا بنقطتين مزدوجتين، قبل نوع الوسيط.
@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 - خريطة بالمفاتيح :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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.