Свобода выражения мнений — это хорошо, и у всех нас есть свой стиль кодирования. Одним из замечательных аспектов 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, и какое из них вы выберете, зависит от вас и вашей команды:
- https://github.com/bbatsov/ruby-style-guide
- https://rails.lighthouseapp.com/projects/8994/source-style
- https://github.com/chneukirchen/styleguide/
- http://www.caliban.org/ruby/rubyguide.shtml
Это далеко не полный список. В конце концов, важно учитывать, можете ли вы автоматизировать проверку соответствия стиля, так как ручная проверка медленная и неисправная.
Автоматическая проверка стиля
Чтобы применить выбранный стиль, вы должны развернуть автоматическую проверку стиля. Для некоторых языков, таких как 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
Завершение
Каждый раз, когда вы начинаете новый проект, обязательно включите автоматическую проверку стиля в самом начале, иначе потребуется приложить немало усилий, чтобы привести все файлы в соответствие.
Если вы наследуете существующий проект с расходящимися стилями, вы можете исключить проверки, которые генерируют наибольшее количество сбоев, поэтому вы можете постепенно привести их в порядок.
Как бы вы это ни делали, применяйте свой стиль. Вы будете очень рады, что сделали.