Статьи

Почему стиль имеет значение

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

Панк

Фото Man Alive!

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

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

Быть единообразным

единообразный

Фото Майкла Натта

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

def foo(var_a,var_b, var_c, varD ) fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" return fooBar end 

(код изменен для защиты виновных)

Сравните это со следующим:

 def foo(a, b, c, d) "a(#{a}) b(#{b}) cd(#{bar(c, d)})" end 

Разница, правда?

Ruby Style Guide

В Ruby есть несколько способов сделать то же самое. Например,

  • Измените путь загрузки, используя $: или $LOAD_PATH
  • Создайте proc, используя proc или Proc.new
  • Используйте module с module_function :foo или class с def self.foo для объекта, который имеет только методы класса.

Затем есть некоторые вещи, которые являются делом вкуса. Например, как сделать отступ, заканчивая строки точкой с запятой, если вы используете круглые скобки для метода без аргументов, пробел после запятой и т. Д. То, что вы выберете, зависит от вас, но есть веские причины для выбора одной над другой.

Доступно несколько руководств по стилю Ruby, и какое из них вы выберете, зависит от вас и вашей команды:

Это далеко не полный список. В конце концов, важно учитывать, можете ли вы автоматизировать проверку соответствия стиля, так как ручная проверка медленная и неисправная.

Автоматическая проверка стиля

Чтобы применить выбранный стиль, вы должны развернуть автоматическую проверку стиля. Для некоторых языков, таких как go , это действительно просто, поскольку сам язык поставляется вместе с ним (см. go fmt ).

В Ruby вы должны полагаться на внешние инструменты.

Rubocop

Я предпочитаю использовать rubocop поскольку он быстрый, легко настраиваемый и имеет разумные значения по умолчанию.

Непрерывная интеграция

Чтобы не допустить попадания плохо отформатированного кода в репозиторий, вы можете использовать ловушку перед фиксацией (если вы используете git ). Вы также должны включить автоматическую проверку в свой сервер непрерывной интеграции. С Rubocop это действительно легко, так как есть задача граблей, которая делает это за вас:

 require 'rspec/core/rake_task' require 'rubocop/rake_task' task default: [:rubocop, :spec] RSpec::Core::RakeTask.new Rubocop::RakeTask.new 

Теперь он будет запускать проверку стиля перед rspec тестов ( rspec ).

Точно так же, если вы используете guard , добавить Rubocop в Guardfile просто, используя драгоценный камень, такой как guard-rubocop . Дело в том, что автоматизированная проверка стиля в вашей рутине проста, и результат того стоит.

Пример вывода

Выполнение ужасного фрагмента кода, который я показал вам в начале через rubocop дает следующий список нарушений:

 $ rubocop foo.rb Inspecting 1 file C Offences: foo.rb:1:14: C: Space missing after comma. def foo(var_a,var_b, var_c, varD ) ^ foo.rb:1:33: C: Space inside parentheses detected. def foo(var_a,var_b, var_c, varD ) ^ foo.rb:1:35: C: Trailing whitespace detected. def foo(var_a,var_b, var_c, varD ) ^ foo.rb:2:1: C: Use 2 (not 3) spaces for indentation. fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" ^^^ foo.rb:2:4: C: Use snake_case for variables. fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" ^^^^^^ foo.rb:2:23: C: Surrounding space missing for operator '+'. fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" ^ foo.rb:2:30: C: Surrounding space missing for operator '+'. fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" ^ foo.rb:2:32: C: Surrounding space missing for operator '+'. fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" ^ foo.rb:2:41: C: Surrounding space missing for operator '+'. fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" ^ foo.rb:2:46: C: Space inside parentheses detected. fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" ^ foo.rb:2:52: C: Space missing after comma. fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" ^ foo.rb:2:58: C: Surrounding space missing for operator '+'. fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" ^ foo.rb:2:59: C: Prefer single-quoted strings when you don't need string interpolation or special symbols. fooBar = "a(#{a}) "+ 'b(' +b+') cd(' +bar( var_c,varD)+")" ^^^ foo.rb:3:1: C: Inconsistent indentation detected. return fooBar ^^ foo.rb:3:3: C: Redundant `return` detected. return fooBar ^^^^^^ foo.rb:5:1: C: 1 trailing blank lines detected. 1 file inspected, 16 offences detected 

Завершение

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

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

Как бы вы это ни делали, применяйте свой стиль. Вы будете очень рады, что сделали.