Простые объекты в Ruby?

Я замечаю в Ruby, для которого для API поставщика очень распространено пасовать назад результаты как массивы? Не были должны Простые Объекты (Как POJOs в Java) быть большим количеством стандарта? Если я пишу свою собственную библиотеку разве, я не должен использовать ПОРОС POJOs?

9
задан John Topley 12 February 2010 в 14:02
поделиться

4 ответа

Это все объекты, все время. Ключ в том, есть ли у возвращаемых объектов поведение, связанное с ними. Это нормально:

  def read_first_and_last_name(data_source)
    [data_source.read_string, data_source.read_string]
  end

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

  def print_name(first_name, last_name)
    puts "#{first_name} #{last_name}"
  end

  def read_and_print_name
    first_name, last_name = read_first_and_last_name(data_source)
    print_name(first_name, last_name)
  end

... тогда они должны быть классом:

  class FullName

    def FullName.read(data_source)
      FullName.new(data_source.read_string, data_source.read_strng)
    end

    def initialize(first_name, last_name)
      @first_name = first_name
      @last_name = last_name
    end

    def print
      puts "#{@first_name} #{@last_name}"
    end

  end

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

  def read_and_print_name
    FullName.read(data_source).print
  end
3
ответ дан 4 December 2019 в 20:23
поделиться

Я считаю, что массив против объекта - это ложная дихотомия.

Совершенно разумно, когда вызов API возвращает более одного объекта, он имеет форму массива (а массив является довольно простым объектом и, следовательно, возможно, «PORO» в Ruby в любом случае)

Изменить: в ответ на ваши комментарии:

Пример, который вы цитируете ( http://github.com/cjheath/geoip ), возвращает массив различных элементов. Я согласен, что это не обязательно лучший формат для возврата данных. В этом случае я бы подумал, что хеш с разумно названными ключами будет лучшей структурой.

Как говорит Джон Топли, объектно-ориентированная природа Ruby означает, что людям не нужно придумывать такую ​​терминологию, как «PORO», поскольку хеш-код настолько прост, насколько это возможно.

4
ответ дан 4 December 2019 в 20:23
поделиться

Что содержат эти массивы результатов? Ответ: в Ruby они содержат объекты, потому что в Ruby все является объектами.

POJO в мире Java были реакцией против некоторых сложностей, навязанных миру корпоративной Java, например, EJBs. Цитируя Мартина Фаулера, который придумал этот термин:

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

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

2
ответ дан 4 December 2019 в 20:23
поделиться

Лично я использую PORO почти во всем, что пишу, если это не совсем бросовый сценарий.

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

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

2
ответ дан 4 December 2019 в 20:23
поделиться