Nebojte, nebudeme si povídat o tom, že je dobré si před jídlem umýt ruce. Řeč bude o nástrojích, pomocí kterých lze v elixirových projektech udržovat to, co lze nazvat “hygiena kódu”. Konkrétně půjde o formátování a statickou analýzu.

Formátování kódu

Od verze 1.6 je podpora pro formátování kódu přímo součástí ekosystému jazyka. Jednoduše v projektovém adresáři napíšete mix format a všechny zdrojové soubory v projektu se přeformátují standardním způsobem. Kouzlo spočívá v souboru .formatter.exs, který se automaticky vygeneruje při zakládání nového projektu pomocí mix new - obsahuje seznam cest k souborům, které se mají formátovat. V konfiguraci .formatter.exs lze vlastnosti formátování měnit, což vřele nedoporučuji (nebo jen výjimečně, např. maximální délku řádku). Formátovat lze samozřejmě i jednotlivé soubory (mix format <cesta k souboru>). Další možností je kontrola, jestli jsou zdrojáky projektu zformátované správně (mix format --check-formatted). Této kontroly využívá mnoho komunitních projektů jako součást CI.

Pluginy podporující formátování existují pro většinu editorů (namátkou Vim, VS Code, IntelliJ IDEA). Více o formátování napoví mix help format.

Credo

Credo je statický analyzátor, který se zaměřuje na konzistenci kódu. Umí poradit, kde můžete kód vylepšit nebo refaktorovat, vynadá, když nemáte okomentovaný modul a podobně. Určitě není na škodu udržovat svůj kód ve stavu, se kterým je credo spokojené. Doporučuji credo používat v přísnějším režimu (mix credo --strict).

Dialyxir

Dialyxir je také statický analyzátor, ovšem zaměřený na hledání nesrovnalostí (a tedy potenciálních chyb) v kódu. Pro dynamický jazyk jako Elixir je taková kontrola velice užitečná, může odhalit hromadu chyb dříve, než program spustíte. Dialyxir je elixirový obal nad erlangovým nástrojem dialyzer. Nelekněte se delšího běhu (i několik minut) při prvním spuštění (mix dialyzer), nástroj si vytvoří pomocné soubory. Další spuštění jsou již mnohem svižnější.

3 v 1

Podle mých zkušeností je užitečné všechny tři nástroje používat co nejdříve od vzniku projektu a udržovat jejich výstup bez chyb. Pokud si chcete usnadnit práci, můžete si pro spuštění všech tří vytvořit alias a následně je pouštět pomocí mix hygiene, viz. následující mix.exs projektu CisteRuce:

defmodule CisteRuce.MixProject do
  use Mix.Project

  def project do
    [
      app: :ciste_ruce,
      version: "0.1.0",
      elixir: "~> 1.9",
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      aliases: aliases()
    ]
  end

  defp deps do
    [
      {:credo, "~> 1.1.0", only: [:dev, :test], runtime: false},
      {:dialyxir, "~> 1.0.0-rc.7", only: [:dev], runtime: false}
    ]
  end

  defp aliases do
    [
      hygiene: [
        "format --check-formatted",
        "credo --strict",
        "dialyzer"
      ]
    ]
  end
end