Изначально опубликовано в блоге Что я узнал.

В начале своей карьеры в Ruby on Rails я использовал инструмент измерения кода Rails Best Practices. Назначение инструмента довольно простое. Он предлагает вам предложения по улучшению вашего кода. Самое приятное то, что на веб-сайте https://rails-bestpractices.com я смог найти подробные инструкции, почему и как исправить эти проблемы.

Мне нравится этот инструмент. Я использовал его каждый день, чтобы проверить свой код. Самое интересное в тех предложениях, что я могу пойти и прочитать объяснение этой проблемы на их сайте. Я использовал этот инструмент в основном для обучения.

Пришло время изучить эликсир. И сегодня я хотел бы открыть для себя аналогичный инструмент Кредо. Credo фокусируется на обучении и согласованности кода.

Во-первых, мы можем установить Credo как зависимость от нашего проекта. Тогда mix credo будет готов к использованию.

Как только мы запустим этот инструмент анализа для нашей кодовой базы. Credo предоставит нам множество проблем и предложений по улучшению кодовой базы.

Credo делит эти проблемы на следующие категории:

  • Читаемость кода
  • Разработка программного обеспечения
  • Возможности рефакторинга
  • Предупреждения
  • Последовательность

Чтобы увидеть полный список с описанием каждой категории, мы можем запустить → mix credo categories:

Теперь попробуем запустить его для нашего проекта. В качестве примеров здесь я бы использовал приложение Prater. Вы могли знать об этом из моих предыдущих постов.

Во-первых, давайте запустим задачу по умолчанию и посмотрим на результаты.

→ mix credo

В моем случае он предоставляет мне список из 14 вопросов. Я вижу сводку в самом низу вывода.

101 mods/funs, found 3 refactoring opportunities, 11 code readability issues.

Мы также можем запустить его в строгом режиме.

→ mix credo --strict
101 mods/funs, found 3 refactoring opportunities, 25 code readability issues, 23 software design suggestions.

На этот раз у меня есть список из 51 вопроса. Похоже, здесь строже.

нет смысла рассматривать все вопросы в этой статье. Итак, давайте выберем один файл и попробуем поработать с ним. Одного файла будет достаточно, чтобы пройтись по нему и выяснить, что означает каждая проблема.

Здесь мы можем увидеть, что у нас получилось после выполнения задачи кредо по умолчанию для файла lib/prater/auth/auth.ex.

А теперь результаты для того же файла, но с режимом strict.

Мы видим, что теперь у нас есть категория «Дизайн программного обеспечения» в дополнение к той, что была у нас раньше.

Если мы попытаемся прочитать вопросы, мы сможем понять, что они означают.

Например, «Модули должны иметь тег @moduledoc». само по себе довольно информативное. С другой стороны, «трубопроводная цепочка должна начинаться с необработанного значения». может потребоваться дополнительное объяснение.

Чтобы получить дополнительную информацию о проблеме, мы можем запустить кредо и указать имя файла и номер строки проблемы. Вы можете увидеть номер строки рядом с описанием проблемы. В моем случае это строка номер 21: lib/prater/auth/auth.ex:21

Мы видим, что у нас гораздо больше информации. Credo показывает нам точную строку нашего кода и множество предложений.

Исходный фрагмент кода

User.registration_changeset(%User{}, params) |> Repo.insert()

Как только мы изменим его на

%User{}
|> User.registration_changeset(params)
|> Repo.insert()

эта проблема исчезнет.

Для примера попробуем рефакторировать еще одну проблему. Вот:

[F] → Cond statements should contain at least two conditions besides `true`.
      lib/prater/auth/auth.ex:8:5 #(Prater.Auth.sign_in)

В расширенном описании говорится:

__ WHY IT MATTERS
   Each cond statement should have 3 or more statements including the
   "always true" statement. Otherwise an `if` and `else` construct might be more appropriate.
   Example:
     cond do
       x == y -> 0
       true -> 1
     end
     # should be written as
     if x == y do
       0
     else
       1
     end

Теперь посмотрим на код:

cond do
  user && Comeonin.Bcrypt.checkpw(password, user.encrypted_password) ->
    {:ok, user}
  true ->
    {:error, :unauthorized}
end

Я думаю, мы можем согласиться с Credo по этому поводу. Давайте обновим его, чтобы использовать вместо него if/else.

if user && Comeonin.Bcrypt.checkpw(password, user.encrypted_password) do
  {:ok, user}
else
  {:error, :unauthorized}
end

И еще одна проблема исправлена.

Подведение итогов

В конце концов, можем ли мы использовать Credo, чтобы узнать что-то новое об Elixir и о том, как отформатировать код? Я думаю, что сможем.

Вы можете пойти еще глубже и выполнить проверку кредо с помощью инструментов CI. Если есть какие-либо проблемы, Credo не сработает с ненулевым статусом выхода. Это может привести к сбою вашей CI-сборки и вынудить вас и разработчиков в вашей команде исправлять проблемы.

В любом случае я рекомендую вам попробовать этот инструмент в своем коде и проверить, как вы можете его улучшить. Более подробную информацию о Credo вы можете найти на странице GitHub.

Изначально опубликовано в блоге Что я узнал.