Рефакторинг кода - инициализация класса из массива - PullRequest
1 голос
/ 13 февраля 2012

Мне просто интересно, есть ли лучший способ инициализировать экземпляр класса из массива:

def initialize(row)
    @name        = row[2]
    @description = row[3]
    @status      = row[5]
    ....

Ответы [ 4 ]

10 голосов
/ 13 февраля 2012

Я обычно использую следующий стиль:

def initialize row
  @name, @description, @status = *row
end

Если вам нужно игнорировать некоторые аргументы, вы можете сделать следующее:

ignored, ignored, @name, @description, ignored, @status = *row

или короче:

_, _, @name, @description, _, @status = *row
6 голосов
/ 13 февраля 2012

Если вам нужно работать с такими данными, как

row = [ 0, 1, 'Smith', 'red nose', 3, 'awake']

и вам нужно идти по положению полей, тогда ваш код в порядке. Вы можете сократить его так:

def initialize (row)
  @name, @description, @status = row.values_at(2,3,5) # things like (5,2,3) are allowed.
end
2 голосов
/ 13 февраля 2012

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

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

def method(array_of_attributes)

придерживайтесь

def method(meaningful_name_1, meaningful_name_2, options={})

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

также нет ничего плохого в передаче массива атрибутов методу, если это важно для вас:

def method_one
  arguments_for_method_two = [name, description, status]
  method_two(*arguments_for_method_two)
end

def method_two(name, description, status)
  # blah ...
end
1 голос
/ 13 февраля 2012

Если вы не возражаете заниматься метапрограммированием (просто храните все имена и индексы в одном месте):

{:name => 2, :description => 3, :status => 5}.each do |name, i| 
  instance_variable_set("@#{name}", row[i]) 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...