Обычные старые объекты в Ruby? - PullRequest
8 голосов
/ 12 февраля 2010

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

Ответы [ 4 ]

4 голосов
/ 12 февраля 2010

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

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

Редактировать: в ответ на ваши комментарии:

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

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

3 голосов
/ 12 февраля 2010

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

  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
2 голосов
/ 12 февраля 2010

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

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

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

2 голосов
/ 12 февраля 2010

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

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

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

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

...