Должен ли я положить вызовы методов в инициализации при использовании Ruby? - PullRequest
4 голосов
/ 13 сентября 2011

Я строю объект календаря.Важно, чтобы у меня был и объект даты, и дата в виде строки.

class Calendar

  def initialize(on, off, date_string)
    @on = on.to_i
    @off = off.to_i
    @date_string = date_string
  end
end

У меня есть метод, который преобразует дату в объект даты.Как мне справиться с этим в инициализации.Должен ли я ввести фиктивное значение, а затем вызвать его позже?Я называю это изнутри инициализировать.Что более идиоматично в Ruby?

Ответы [ 4 ]

2 голосов
/ 13 сентября 2011

Более объектно-ориентированный способ - преобразовать как можно раньше и сохранить расширенный объект (здесь: Дата) внутри вашего нового объекта.Возможно, вам нужно конвертировать данное date_or_string в дату.

Реализация может быть:

class Calendar
  def initialize(on, off, date_or_string)
    @on = on.to_i
    @off = off.to_i
    @date = convert_to_date(date_or_string)
  end

  def convert_to_date(date_or_string)
     ... # Implementation here
  end
end
1 голос
/ 13 сентября 2011

Возможно, вы захотите написать метод назначения:

def date=(date_string)
  @date = ...(date_string)
end

Может быть полезно преобразовать другие аналогичным образом, если требуется, а затем объявить методы доступа для чтения, если применимо:

attr_reader :on, :off, :date

В своем конструкторе вы просто применили бы следующее:

def initialize(on, off, date_string)
  self.on = on
  self.off = off
  self.date = date_string
end
1 голос
/ 13 сентября 2011

Я бы поставил это правильно в инициализаторе так:

class Calendar

  DATE_FORMAT = "%d/%m/%Y"

  def initialize(on, off, date_string)
    @on = on.to_i
    @off = off.to_i
    @date = Date.strptime(date_string, DATE_FORMAT)
  end
end
0 голосов
/ 14 сентября 2011

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

class Calendar

  def self.new_using_strings(on_string, off_string, date_string)
    on = on_string.to_i # Or Integer(on_string)
    off = off_string.to_i # Or Integer(off_string)
    date = convert_to_date(date_string)
    new(on, off, date)
  end

  def self.convert_to_date(date_string)
    # Implementation goes here
  end

  def initialize(on, off, date)
    @on, @off, @date = on, off, date
  end
end

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

Однако я не видел, чтобы кто-то другой использовал такой подход.

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