Spec-Zone.ru › Elixir 1.9

Написание документации

Elixir рассматривает документацию как объект первого класса. Это означает, что документация должна быть легко написана и легко прочитана. В этом документе вы узнаете, как писать документацию на Elixir, охватывая такие конструкции, как атрибуты модулей, практики стиля и doctests.

Markdown

Документация Elixir написана с использованием Markdown. В интернете существует множество руководств по Markdown, мы рекомендуем руководства GitHub в качестве точки входа:

  • Основные синтаксис написания и форматирования
  • Освоение Markdown

Атрибуты модулей

Документация на Elixir обычно прикрепляется к атрибутам модулей. Давайте рассмотрим пример:

defmodule MyApp.Hello do
  @moduledoc """
  This is the Hello module.
  """
  @moduledoc since: "1.0.0"

  @doc """
  Says hello to the given `name`.

  Returns `:ok`.

  ## Examples

      iex> MyApp.Hello.world(:john)
      :ok

  """
  @doc since: "1.3.0"
  def world(name) do
    IO.puts("hello #{name}")
  end
end

Атрибут @moduledoc используется для добавления документации к модулю. @doc используется перед функцией, чтобы предоставить документацию к ней. Помимо вышеуказанных атрибутов, @typedoc также может быть использован для добавления документации к типам, определенным в рамках typespec. Elixir также позволяет добавлять метаданные к документации, передавая список ключевых слов в @doc и аналогичные функции.

Аргументы функций

При документировании функции имена аргументов выводятся компилятором. Например:

def size(%{size: size}) do
  size
end

Компилятор выведет этот аргумент как map. Иногда вывод будет не оптимальным, особенно если функция содержит несколько пунктов с аргументом, сопоставляющим разные значения каждый раз. Вы можете указать правильные имена для документации, объявив только заголовок функции в любой момент до реализации:

def size(map_with_size)
def size(%{size: size}) do
  size
end

Метаданные документации

Elixir позволяет разработчикам добавлять произвольные метаданные к документации. Это делается путем передачи списка ключевых слов соответствующему атрибуту (такому как @moduledoc, @typedoc, и @doc). Часто используемые метаданные — :since, который отмечает, в какой версии был добавлен конкретный модуль, функция, тип или обратный вызов, как показано в примере выше.

Другими часто используемыми метаданными являются :deprecated, которые генерируют предупреждение в документации, объясняя, что их использование не рекомендуется:

@doc deprecated: "Use Foo.bar/2 instead"

Обратите внимание, что ключ :deprecated не предупреждает, когда разработчик вызывает функции. Если вы хотите, чтобы код также генерировал предупреждение, вы можете использовать атрибут @deprecated.

@deprecated "Use Foo.bar/2 instead"

Метаданные могут иметь любой ключ. Инструменты документации часто используют метаданные для предоставления большего количества данных читателям и обогащения пользовательского опыта.

Рекомендации

При написании документации:

  • Сократите первый абзац документации, обычно одну строку. Такие инструменты, как ExDoc, используют первую строку для генерации сводки.

  • Ссылки на модули по их полному имени.

    Markdown использует обратные кавычки (`) для цитирования кода. Elixir опирается на это, чтобы автоматически генерировать ссылки при ссылке на имена модулей или функций. По этой причине всегда используйте полные имена модулей. Если у вас есть модуль под названием MyApp.Hello, всегда ссылайтесь на него как на `MyApp.Hello` и никогда как на `Hello`.

  • Ссылки на функции по имени и арности, если они локальные, как в `world/1`, или по модулю, имени и арности, если указываете на внешний модуль: `MyApp.Hello.world/1`.

  • Ссылки на @callback, добавляя c:, как в `c:world/1`.

  • Ссылки на @type , добавляя t:, как в `t:values/0`.

  • Начинайте новые разделы с заголовков Markdown второго уровня ##. Заголовки первого уровня зарезервированы для имен модулей и функций.

  • Размещайте документацию перед первым пунктом многоточечных функций. Документация всегда относится к каждой функции и арности, а не к каждому пункту.

  • Используйте ключ :since в метаданных документации, чтобы отмечать каждый раз, когда к вашему API добавляются новые функции или модули.

Doctests

Мы рекомендуем разработчикам включать примеры в свою документацию, часто под собственным заголовком ## Examples. Чтобы убедиться, что примеры не устарели, фреймворк тестов Elixir (ExUnit) предоставляет функцию под названием doctests, которая позволяет разработчикам тестировать примеры в своей документации. Doctests работают, анализируя примеры кода, начинающиеся с iex> из документации. Вы можете узнать больше об этом по адресу ExUnit.DocTest.

Обратите внимание, что doctests имеют ограничения. Когда невозможно протестировать функцию с помощью doctests, потому что она зависит от состояния или побочных эффектов, мы рекомендуем разработчикам включать примеры напрямую без запроса iex>.

Документация ≠ Комментарии к коду

Elixir рассматривает документацию и комментарии к коду как разные понятия. Документация — это явный договор между вами и пользователями вашего интерфейса программирования приложений (API), будь то сторонние разработчики, коллеги или вы сами в будущем. Модули и функции всегда должны быть задокументированы, если они являются частью вашего API.

Комментарии к коду предназначены для разработчиков, читающих код. Они полезны для маркировки улучшений, оставления заметок (например, почему вам пришлось прибегнуть к обходному решению из-за ошибки в библиотеке) и так далее. Они связаны с исходным кодом: вы можете полностью переписать функцию и удалить все существующие комментарии к коду, и она продолжит работать так же, без изменений ни в поведении, ни в документации.

Поскольку к частным функциям нельзя получить доступ извне, Elixir будет предупреждать, если у частной функции есть атрибут @doc и игнорировать его содержимое. Однако вы можете добавлять комментарии к коду в частные функции, как и к любому другому фрагменту кода, и мы рекомендуем разработчикам делать это всякий раз, когда они считают, что это добавит полезной информации читателям и лицам, поддерживающим такой код.

Наконец, будьте осторожны с избыточными комментариями к коду, такими как те, которые описывают то же самое, что и код:

# Total is the sum of the batch and individual entries
total = batch_sum + individual_sum

Подводя итог, документация — это договор с пользователями вашего API, которые могут не иметь доступа к исходному коду; в то время как комментарии к коду предназначены для тех, кто взаимодействует напрямую с исходным кодом. Вы можете узнать и выразить различные гарантии о своем программном обеспечении, разделив эти два понятия.

Скрытие внутренних модулей и функций

Помимо модулей и функций, предоставляемых библиотеками как часть их публичного интерфейса, библиотеки могут также реализовывать важную функциональность, которая не входит в их API. Хотя к этим модулям и функциям можно получить доступ, они предназначены для внутреннего использования в библиотеке и, следовательно, не должны иметь документации для конечных пользователей.

Удобно, что Elixir позволяет разработчикам скрывать модули и функции из документации, установив @doc false для скрытия конкретной функции или @moduledoc false для скрытия всего модуля. Если модуль скрыт, вы можете даже документировать функции в модуле, но сам модуль не будет отображаться в документации:

defmodule MyApp.Hidden do
  @moduledoc false

  @doc """
  This function won't be listed in docs.
  """
  def function_that_wont_be_listed_in_docs do
    # ...
  end
end

Однако имейте в виду, что добавление @doc false не делает функцию частной. Вышеупомянутую функцию все еще можно вызвать как MyApp.Sample.add(1, 2). Более того, если импортирован MyApp.Sample, функция add/2 также будет импортирована в вызывающий код. По этим причинам будьте осторожны при добавлении @doc false к функциям, вместо этого используйте один из следующих двух вариантов:

  • Переместите функцию без документации в модуль с @moduledoc false, как в MyApp.Hidden, чтобы гарантировать, что функция не будет случайно экспонирована или импортирована. Помните, что вы можете использовать @moduledoc false для скрытия целого модуля и все еще документировать каждую функцию с @doc. Инструменты по-прежнему проигнорируют модуль.

  • Начните имя функции с одного или двух подчеркиваний, например, __add__/2, и добавьте @doc false. Компилятор не импортирует функции с ведущими подчеркиваниями, и они намекают любому, кто читает код, об их предполагаемом внутреннем использовании.

Code.fetch_docs/1

Elixir хранит документацию внутри предварительно определенных блоков в байткоде. К ней можно получить доступ из Elixir с помощью функции Code.fetch_docs/1. Это также означает, что к документации обращаются только при необходимости, а не при загрузке модулей виртуальной машиной. Единственный недостаток заключается в том, что модули, определенные в памяти, такие как те, что определены в IEx, не могут иметь доступа к своей документации, так как их байт-код не записывается на диск.

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.9.4/writing-documentation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API