Изначально опубликовано в блоге Что я узнал.
В начале своей карьеры в 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.
Изначально опубликовано в блоге Что я узнал.