مسیرها
/
Elixir
Elixir
/
تمرین‌ها
/
اداره‌ی شهر
اداره‌ی شهر

اداره‌ی شهر

تمرین یادگیری

مقدمه

مستندات

مستندات در 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.

فهرست کامل همه‌ی نوع‌ها را می‌توان در بخش «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()

از یک نوع سفارشی می‌توان در همان ماژولی که تعریف شده، یا در ماژول دیگری استفاده کرد.

دستورالعمل‌ها

مدتی است که در اداره‌ی شهر کار می‌کنید و مجموعه‌ای از ابزارها را ساخته‌اید که کارهای روزمره‌تان را سرعت می‌بخشند، مثلاً پر کردن فرم‌ها.

حالا همکار تازه‌ای به شما ملحق می‌شود و متوجه شده‌اید که ابزارهایتان ممکن است به‌خودی‌خود روشن و قابل‌فهم نباشند. در اداره‌ی شما رسم‌های عجیب و غریب زیادی وجود دارد؛ مثلاً همیشه فرم‌ها را با حروف بزرگ پر می‌کنند و از خالی گذاشتن فیلدها پرهیز می‌کنند.

تصمیم می‌گیرید مستنداتی بنویسید تا همکار تازه‌تان راحت‌تر وارد کار شود و استفاده از ابزارهایتان را شروع کند.

1. هدف ابزارهای فرم را مستند کنید

به ماژول Form مستنداتی اضافه کنید که هدفش را توصیف کند. متن آن باید این باشد:

A collection of loosely related functions helpful for filling out various forms at the city office.

2. پر کردن فیلدها با مقدارهای خالی را مستند کنید

به تابع Form.blanks/1 مستندات و یک typespec اضافه کنید. مستندات باید این باشد:

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.

typespec باید توضیح دهد که تابع یک آرگومان می‌پذیرد، یک عدد صحیح نامنفی، و یک رشته برمی‌گرداند.

3. تقسیم مقدارها به فهرست‌هایی از حروف بزرگ را مستند کنید

به تابع Form.letters/1 مستندات و یک typespec اضافه کنید. مستندات باید این باشد:

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.

typespec باید توضیح دهد که تابع یک آرگومان می‌پذیرد، یک رشته، و فهرستی از رشته‌ها برمی‌گرداند.

4. بررسی اینکه آیا یک مقدار در فیلدی با حداکثر طول جا می‌شود را مستند کنید

به تابع Form.check_length/2 مستندات و یک typespec اضافه کنید. مستندات باید این باشد:

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.

typespec باید توضیح دهد که تابع دو آرگومان می‌پذیرد، یک رشته و یک عدد صحیح نامنفی، و یکی از دو مقدار ممکن را برمی‌گرداند. یا اتم :ok را برمی‌گرداند، یا یک تاپل دوتایی که عنصر اول آن اتم :error است و عنصر دوم یک عدد صحیح مثبت.

5. قالب‌های مختلف آدرس را مستند کنید

به دلیلی که برایتان نامعلوم است، سیستم داخلی اداره‌ی شهر از دو روش متفاوت برای نمایش آدرس‌ها استفاده می‌کند: یا به‌صورت یک مپ یا به‌صورت یک تاپل.

این موضوع را با تعریف سه نوع عمومی سفارشی مستند کنید:

  • address_map: یک مپ با کلیدهای :street، :postal_code و :city. هر کلید مقداری از نوع رشته نگه می‌دارد.
  • address_tuple: یک تاپل با سه مقدار، street، postal_code و city. هر مقدار از نوع رشته است. مقدارها را با دادن اسم به آن‌ها در typespec از هم متمایز کنید.
  • address: می‌تواند یا یک address_map باشد یا یک address_tuple.

6. قالب‌بندی آدرس را مستند کنید

به تابع Form.format_address/1 مستندات و یک typespec اضافه کنید. مستندات باید این باشد:

Formats the address as an uppercase multiline string.

typespec باید توضیح دهد که تابع یک آرگومان می‌پذیرد، یک آدرس، و یک رشته برمی‌گرداند.

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elixir Exercism

آماده‌اید اداره‌ی شهر را شروع کنید؟

در Exercism ثبت‌نام کنید تا Elixir را همراه با 58 مفهوم168 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.