Вы когда-нибудь писали или читали код и сталкивались с кодом, который казался вам дрянным или не очень хорошим? Само существование такого кода может привести к ухудшению работоспособности и читабельности системы. Используя инструмент под названием Reek, вы можете вынюхивать некачественный (или в данном случае вонючий) код.

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

Установка Река

Используйте Rubygems для установки.

$ gem install reek

Reek поддерживает версии MRI ruby ​​с 2.1 по 2.4, и хотя он официально не поддерживает JRuby или Rubinius, они, по-видимому, тоже работают.

Выполнение Reek

Выполнить Reek просто; просто укажите каталог и выполните команду «reek».

$ reek /path/to/project

Вы можете выбрать каталоги, а также отдельные файлы.

При этом список потенциальных проблемных областей будет выведен в виде списка.

$ reek .
lib/ncmb/acl.rb -- 16 warnings:
  [29]:BooleanParameter: NCMB::Acl#public has boolean parameter 'bol' [https://github.com/troessner/reek/blob/master/docs/Boolean-Parameter.md]
  [38]:BooleanParameter: NCMB::Acl#role has boolean parameter 'value' [https://github.com/troessner/reek/blob/master/docs/Boolean-Parameter.md]
  [33]:BooleanParameter: NCMB::Acl#user has boolean parameter 'value' [https://github.com/troessner/reek/blob/master/docs/Boolean-Parameter.md]
  [39, 40]:DuplicateMethodCall: NCMB::Acl#role calls '@fields[role.name.to_sym]' 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
  [39, 39, 40]:DuplicateMethodCall: NCMB::Acl#role calls 'role.name' 3 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
  [39, 39, 40]:DuplicateMethodCall: NCMB::Acl#role calls 'role.name.to_sym' 3 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]

Также выводится URL-адрес документа, в котором указывается характер проблемы, что позволяет легко проверить, в чем проблема.

Указав параметр «-f [формат]», вы можете выбрать желаемый формат вывода. Например, в следующем примере показано, как выводить результаты в формате HTML.

$ reek -f html . > result.html

Вы можете выбрать текстовый формат (по умолчанию) /html/yaml/json/xml/code_climate .

Создание файла задач

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

$ reek -t .
'.todo.reek' generated! You can now use this as a starting point for your configuration.

При этом будет создан файл .todo.reek. Это файл настроек Reek, в котором отключено все содержание предупреждений. Содержимое файла выглядит так:

$ cat .todo.reek
---
BooleanParameter:
  exclude:
  - NCMB::Acl#public
  - NCMB::Acl#role
  - NCMB::Acl#user
DuplicateMethodCall:
  exclude:
  - NCMB::Acl#role

Другими словами, если вы выберете этот файл настроек и выполните его, никаких предупреждений не появится вообще. В обозначениях файлов настроек используется опция ‘-c’.

$ reek -c .todo.reek 
Inspecting 32 file(s):
................................
 
0 total warnings

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

Reek по умолчанию читает файлы .reek при использовании. После того, как для файла .reek установлено достаточное количество настроек, лучше всего переименовать его. Кроме того, рекомендуемые настройки SideCI можно найти здесь: Нажмите здесь для рекомендуемых настроек SideCI.

Выявленные примеры и как их избежать

Например, давайте определим, когда у одного класса много разных методов. По умолчанию для этого будет, если один класс имеет 15 или более методов, тогда появится предупреждение TooManyMethods. Другими примерами могут быть вложенные итераторы, и в этом случае появится предупреждение NestedIterators (по умолчанию для этого предупреждения используется одно вложение). Существуют и другие предупреждения для вызова нескольких методов.

Вероятно, есть и такие предупреждения, от которых просто невозможно уклониться. Хотя есть способ описать файлы настроек, вы также можете избежать предупреждений, используя комментарии в исходном коде. Например, если вы собираетесь избежать предупреждений о множественных вызовах, вы будете использовать дескриптор. Только в это время вы будете менять настройки.

# :reek:DuplicateMethodCall { max_calls: 2 }
def user(user, read_or_write, value = true)
  @fields[user.objectId.to_sym] = {read: true, write: true} unless @fields[user.objectId.to_sym]
  @fields[user.objectId.to_sym][read_or_write.to_sym] = value
end

Поскольку для Reek существует очень большое количество индикаторов, вероятно, лучше всего использовать комментарии и файлы настроек, чтобы выбрать только те биты, которые вам понадобятся, чтобы избавиться от некачественного кода. Пожалуйста, также рассмотрите возможность использования этого: Файл рекомендуемых настроек Side CI.

Reek можно запускать с собственного компьютера локально, но если ваша команда разработчиков состоит из нескольких разных людей, то лучше всего использовать его в облаке, чтобы он мог проверять работу всех вместе. SideCI также поддерживает Reek и поможет улучшить удобство обслуживания и читабельность ваших проектов Ruby. SideCI предоставляет бесплатную пробную версию, поэтому, пожалуйста, ознакомьтесь с ней.