2016-03-23 3 views
0

Я хочу создать объект, который можно инициализировать двумя разными способами. Я нашел 3 разных способа выполнить одно и то же, я хочу знать, какой из моих методов является лучшим, и если есть еще один лучший способ сделать это.Инициализация класса Ruby

Метод

attr_accessor :id, :status, :dateTime 
    def initialize *args 
    if args.length == 1 
     puts args[0] 
    @id = args[0]['id'] 
    @status = args[0]['status'] 
    @dateTime = args[0]['dateTime'] 
    else 
     @id = args[0] 
     @status = args[1] 
     @dateTime = args[2] 
    end 
    end 

Способ 2: (заметим, что мне нужно установить параметры вручную на этом в качестве второго пути)

attr_accessor :id, :status, :dateTime 
    def initialize hash = nil 
    if hash != nil 
    @id = hash['id'] 
     @status = hash['status'] 
     @dateTime = hash['dateTime'] 
    end 
    end 

Способ 3: (заметим, что мне нужно установить параметры вручную на этом как второй способ и что он почти такой же, как мой второй способ, просто не в конструкторе)

attr_accessor :id, :status, :dateTime 
    def initialize 
    end 

    def self.create hash 
    if hash != nil 
     obj = Obj3.new 
     obj.id = hash['id'] 
     obj.status = hash['status'] 
     obj.dateTime = hash['dateTime'] 
     return obj 
    end 
    end 

Спасибо заранее!

+0

Какие аргументы они берут? – sawa

+0

'Метод 2: (обратите внимание, что мне нужно установить параметры вручную на этом как второй способ). Разве не очевидно, что второй метод/путь следует второму? – sawa

+0

@sawa Возможно, мне нужно было быть более ясным. Он принимает хэш с идентификатором, статусом и dateTime ИЛИ я мог бы инициализировать объект без параметров и сказать object.id = "id" и т. Д. –

ответ

3

Я хотел бы попробовать использовать хэш для конструктора, как код ниже адаптировано из DRY Ruby Initialization with Hash Argument

class Example 
    attr_accessor :id, :status, :dateTime 

    def initialize args 
    args.each do |k,v| 
     instance_variable_set("@#{k}", v) unless v.nil? 
    end 
    end 
end 

Таким образом, установка каждого из свойств в конструктор становится необязательным. Поскольку метод instance_variable_set будет устанавливать каждое свойство, если оно содержит значение для него.

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

Создание нового объекта - Примеры использования

Чтобы создать новый объект с этой техникой все, что вам нужно сделать, это пройти в хэш-вашему Инициализатором:

my_new_example = Example.new :id => 1, :status => 'live' 
#=> #<Example: @id=1, @status='live'> 

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

my_second_new_example = Example.new :id => 1 
#=> #<Example: @id=1> 

my_third_new_example = Example.new :status => 'nonlive', :dateTime => DateTime.new(2001,2,3) 
#=> #<Example: @id=1, @dateTime=2001-02-03T00:00:00+00:00> 

Вы все еще можете обновить свои свойства, как только были созданы объекты:

my_new_example.id = 24 
+0

Но теперь мне нужно иметь возможность устанавливать значения через хэш или через взаимодействие с объектом, например инициализировать объект как obj = Example.new; obj.id = "a id" –

+1

Не совсем - я обновлю ответ с примерами использования. – Tom

+0

Итак, если я правильно понимаю, я могу инициализировать объект с любым количеством параметров, те, которые не заданы, будут оставлены без изменений, и я смогу установить их позже. Также, если я это правильно понимаю, могу сказать my_new_example = Example.new my_new_example.id = 23 –

Смежные вопросы