Хорошо ли иметь локальные переменные, начинающиеся с подчеркивания? - PullRequest
9 голосов
/ 23 января 2012

Я только вхожу в Ruby и пришел из среды Java и C / C ++.

При кодировании первого небольшого проекта на Ruby я как-то привык, что все локальные переменные начинаются с подчеркивания.Я думаю, что моей основной мотивацией для этого была лучшая читаемость и отличие от вызовов методов.

Поскольку в принципе существует только три типа переменных ($global, @instance и local), подавляющее большинствопеременных начинаются с подчеркивания.Я не совсем уверен, хорошо это или плохо.Кроме того, во многих других языках подчеркивание будет заменено каким-либо другим символом.

Есть ли как-то рекомендация относительно именования переменных рядом с обычными CamelCase и/ или подчеркивание разделено ?Каковы привычки профессиональных "рубинов"?Я пропустил некоторые общие правила Ruby, когда выбрал нижнее подчеркивание?


edit
Благодаря всем ответам и предложениям.Это мне очень помогло.


Краткое резюме ответов и комментариев ниже
(для кратковременного посетителя)

Ведущие подчеркивания идут с:

  • аргументы метода: def my_method(_my_arg)
  • аргументы блока: например, my_array.each { |_x| puts _x}

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

Для визуального разделения между именами переменных и вызовами методов, заставляя себя использовать "("скобки ")" с всеми вызовами методов могут значительно улучшить читаемость.

Ответы [ 4 ]

6 голосов
/ 10 августа 2017

Существующим ответам на этот вопрос уже несколько лет, и соглашения изменились.Вы должны использовать только начальное подчеркивание (_some_param) или отдельное подчеркивание (_), чтобы указать, что вам не важно значение.Инструмент для рисования в стиле rubocop будет относиться к «бесполезному назначению», если вы присваиваете переменную, но не используете ее, но игнорируете переменные с начальным подчеркиванием.Это позволяет вам явно указать, что вы не заботитесь о значении и не собираетесь его использовать.

Вот несколько вымышленный пример использования в контексте RSpec:

describe 'login' do
  let(:user) { FactoryGirl.create(:user, login: 'bob') }
  it 'must be unique' do
    _user1 = user
    user2 = User.new login: 'bob'
    expect(user2.valid?).to be_false
  end
end

Здесь мы указываем, что у нашего user помощника есть побочный эффект и что-то возвращает, но нас это не волнует.Вы также можете просто полностью пропустить присваивание, но видение голой user на строке само по себе выглядит странно и не раскрывает намерение так ясно:

describe 'login' do
  let(:user) { FactoryGirl.create(:user, login: 'bob') }
  it 'must be unique' do
    user
    user2 = User.new login: 'bob'
    expect(user2.valid?).to be_false
  end
end

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

def greet(name, _title)
  puts "Hi, #{name}!"
end
3 голосов
/ 23 января 2012

По моему опыту, переменные с префиксом подчеркивания в Ruby очень похожи на переменные с префиксом подчеркивания в JavaScript: флаг "не трогать". Более конкретно, они используются, когда разработчик делает что-то, что на самом деле не должно восприниматься как часть объекта или не должно рассматриваться как концептуальный интерфейс объекта.

Это более ясно в мире JavaScript, где кто-то эмулирует «приватный», добавляя префикс к подчеркиванию. Они кодируют, что есть часть объекта, которая находится под капотом и может игнорироваться, если смотреть на объект снаружи.

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

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

Что касается различия между вызовами методов, если вы беспокоитесь о том, что может возникнуть путаница между методом и локальной переменной, я бы уточнил метод на self. Например:

def foo
    ...
end

def some_method
    foo # method
    bar # variable
end

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

def some_method
    self.foo
    bar
end
2 голосов
/ 24 января 2012

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

a = thing # var
b = thing() # method

Возможным преимуществом этого является удобочитаемость для других. Кто-то может задаться вопросом о ваших ведущих _, но использование () для всех вызовов методов должно быть понятно всем.

1 голос
/ 23 января 2012

Поскольку переменные экземпляра имеют знак @ перед ними, а глобальные переменные имеют знак $ перед ними, уже в ruby, возможно, нет необходимости ставить символ подчеркивания перед переменнойимена.При этом, я не думаю, что это плохая практика обязательно.Если это помогает вам читать или писать свой код на Ruby, тогда вы должны его использовать.

Я иногда видел код на Ruby, где перед аргументом для метода экземпляра класса стоит подчеркивание.Например:

def my_method(_argument1)
  # do something
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...