Az Elixirben a dokumentáció első osztályú állampolgár.
Két modulattribútumot szokás a kód dokumentálására használni: a @moduledoc attribútumot egy modul dokumentálására, és a @doc attribútumot az őt követő függvény dokumentálására. A @moduledoc attribútum általában a modul első sorában jelenik meg, a @doc attribútum pedig rendszerint közvetlenül egy függvénydefiníció előtt áll, vagy a függvény típusspecifikációja előtt, ha van ilyen. A dokumentációt általában többsoros stringben írjuk, heredoc szintaxissal.
Az Elixir dokumentációja Markdown formátumban íródik.
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
Az Elixir dinamikusan típusos nyelv, ami azt jelenti, hogy nem végez fordítási idejű típusellenőrzéseket. A típusspecifikációk ettől függetlenül használhatók a dokumentáció egy formájaként.
Egy függvényhez a @spec modulattribútummal adhatunk típusspecifikációt, közvetlenül a függvénydefiníció előtt. A @spec után a függvény neve következik, majd zárójelben a függvény összes argumentumának típusa, vesszővel elválasztva. A visszatérési érték típusát egy kettős kettőspont :: választja el a függvény argumentumaitól.
@spec longer_than?(String.t(), non_neg_integer()) :: boolean()
def longer_than?(string, length), do: String.length(string) > length
A leggyakrabban használt típusok:
boolean()
String.t()
integer(), non_neg_integer(), pos_integer(), float()
list()
any()
Néhány típus paraméterezhető is, például a list(integer) egész számok listája.
Típusként literálértékek is használhatók.
A típusok unióját a függőleges vonal | segítségével írhatjuk le. Például az integer() | :error jelentése: vagy egy egész szám, vagy az :error atom literál.
Az összes típus teljes listáját a hivatalos dokumentáció „Typespecs” szakaszában találod.
A típusspecifikációban az argumentumokat el is nevezhetjük, ami hasznos, ha több azonos típusú argumentumot kell megkülönböztetni. Az argumentum neve, utána egy kettős kettőspont, az argumentum típusa elé kerül.
@spec to_hex({hue :: integer, saturation :: integer, lightness :: integer}) :: String.t()
A típusspecifikációk nem korlátozódnak csupán a beépített típusokra. Egyedi típusokat a @type modulattribútummal definiálhatunk. Egy egyedi típus definíciója a típus nevével kezdődik, amit egy kettős kettőspont, majd maga a típus követ.
@type color :: {hue :: integer, saturation :: integer, lightness :: integer}
@spec to_hex(color()) :: String.t()
Egy egyedi típust használhatunk abban a modulban, ahol definiáltuk, vagy egy másik modulból is.
Már egy ideje a városi hivatalban dolgozol, és kifejlesztettél egy csomó eszközt, amelyek felgyorsítják a mindennapi munkádat, például az űrlapok kitöltését.
Most egy új kolléga csatlakozik hozzád, és rájöttél, hogy az eszközeid lehet, hogy nem maguktól értetődőek. Sok furcsa szokás van a hivatalodban, például hogy mindig nagybetűkkel kell kitölteni az űrlapokat, és nem szabad üresen hagyni a mezőket.
Úgy döntesz, hogy írsz egy kis dokumentációt, hogy az új kollégád könnyebben rögtön belevághasson, és elkezdhesse használni az eszközeidet.
Adj dokumentációt a Form modulhoz, amely leírja a célját. A dokumentációnak így kell szólnia:
A collection of loosely related functions helpful for filling out various forms at the city office.
Adj hozzá dokumentációt és típusleírást a Form.blanks/1 függvényhez. A dokumentációnak így kell szólnia:
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.
A típusleírásnak azt kell magyaráznia, hogy a függvény egyetlen argumentumot, egy nemnegatív egész számot fogad, és egy stringet ad vissza.
Adj hozzá dokumentációt és típusleírást a Form.letters/1 függvényhez. A dokumentációnak így kell szólnia:
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.
A típusleírásnak azt kell magyaráznia, hogy a függvény egyetlen argumentumot, egy stringet fogad, és stringek listáját adja vissza.
Adj hozzá dokumentációt és típusleírást a Form.check_length/2 függvényhez. A dokumentációnak így kell szólnia:
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.
A típusleírásnak azt kell magyaráznia, hogy a függvény két argumentumot, egy stringet és egy nemnegatív egész számot fogad, és két lehetséges érték egyikét adja vissza. Vagy a :ok atomot adja vissza, vagy egy 2-elemű tuple-t, amelynek első eleme a :error atom, a második pedig egy pozitív egész szám.
Számodra ismeretlen okból a városi hivatal belső rendszere két különböző módon ábrázolja a címeket: vagy mapként, vagy tupleként.
Dokumentáld ezt a tényt három egyedi nyilvános típus definiálásával:
address_map - egy map a :street, :postal_code és :city kulcsokkal. Minden kulcs egy string típusú értéket tárol.address_tuple - egy tuple három értékkel: street, postal_code és city. Minden érték string típusú. Különböztesd meg az értékeket úgy, hogy neveket adsz nekik a típusleírásban.address - lehet address_map vagy address_tuple.Adj hozzá dokumentációt és típusleírást a Form.format_address/1 függvényhez. A dokumentációnak így kell szólnia:
Formats the address as an uppercase multiline string.
A típusleírásnak azt kell magyaráznia, hogy a függvény egy argumentumot, egy címet fogad, és egy stringet ad vissza.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elixir nyelvet 58 fogalom168 feladat segítségével, valódi emberi mentorálással, mindez ingyen.