Что лучше? Создание переменной экземпляра или передача локальной переменной в Ruby? - PullRequest
5 голосов
/ 23 ноября 2010

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

Пример кода для уточнения:

class Test
  @foo = "something"

  def self.a
    if @foo == "something"
      puts "do #{@foo}"
    end
  end

  a()
end

против

class Test
  foo = "something"

  def self.a(foo)
    if foo == "something"
      puts "do #{foo}"
    end
  end

  a(foo)
end

Ответы [ 3 ]

3 голосов
/ 23 ноября 2010

Я не передаю переменную экземпляра. Это значения состояния для экземпляра.

Думайте о них как о части ДНК этого конкретного объекта, чтобы они всегда были частью того, что делает объект тем, чем он является. Если я вызову метод этого объекта, он уже будет знать, как получить доступ к своей собственной ДНК, и сделает это внутренне, а не через какой-либо параметр, передаваемый внутрь.

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

2 голосов
/ 23 ноября 2010

Как вы упомянули, это не функциональная проблема с кодом.Имея это в виду ...

Трудно дать определенное правило об этом, поскольку оно полностью зависит от контекста.Переменная установлена ​​один раз и забыта или постоянно обновляется?Сколько методов используют одну и ту же переменную?Как будет использоваться код?

По моему опыту, переменные, которые управляют поведением объекта, но редко (если вообще) модифицируются, задаются в методе initialize или передаются методу, который будет каскадно работать.Библиотеки и листовые методы, как правило, передают переменную, так как, вероятно, кто-то захочет вызвать ее изолированно.

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

1 голос
/ 23 ноября 2010

Если мне нужна переменная, которая находится на уровне экземпляра, я использую переменную экземпляра, установленную в методе initialize.

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

Итакответ на ваш вопрос «Когда моя переменная должна быть в области видимости», и я не могу ответить на этот вопрос, не увидев весь ваш код и не зная, что вы планируете с ним делать.

Если ваше поведение объекта должно быть статически установлено на этапе инициализации, я бы использовал переменную экземпляра.

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