Я замечаю в Ruby, для которого для API поставщика очень распространено пасовать назад результаты как массивы? Не были должны Простые Объекты (Как POJOs в Java) быть большим количеством стандарта? Если я пишу свою собственную библиотеку разве, я не должен использовать ПОРОС POJOs?
Это все объекты, все время. Ключ в том, есть ли у возвращаемых объектов поведение, связанное с ними. Это нормально:
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
Я считаю, что массив против объекта - это ложная дихотомия.
Совершенно разумно, когда вызов API возвращает более одного объекта, он имеет форму массива (а массив является довольно простым объектом и, следовательно, возможно, «PORO» в Ruby в любом случае)
Изменить: в ответ на ваши комментарии:
Пример, который вы цитируете ( http://github.com/cjheath/geoip ), возвращает массив различных элементов. Я согласен, что это не обязательно лучший формат для возврата данных. В этом случае я бы подумал, что хеш с разумно названными ключами будет лучшей структурой.
Как говорит Джон Топли, объектно-ориентированная природа Ruby означает, что людям не нужно придумывать такую терминологию, как «PORO», поскольку хеш-код настолько прост, насколько это возможно.
Что содержат эти массивы результатов? Ответ: в Ruby они содержат объекты, потому что в Ruby все является объектами.
POJO в мире Java были реакцией против некоторых сложностей, навязанных миру корпоративной Java, например, EJBs. Цитируя Мартина Фаулера, который придумал этот термин:
"Мы удивлялись, почему люди были так против использования обычных объектов в своих системах и пришли к выводу, что это было потому что простым объектам не хватает модного названия. Поэтому мы дали им такое название, и оно очень хорошо прижилось".
К счастью, в Ruby всегда было естественно для людей просто практиковать объектно-ориентированное программирование без необходимости изобретать терминологию вокруг него.
Лично я использую PORO почти во всем, что пишу, если это не совсем бросовый сценарий.
Я часто создаю класс типа держателя данных, который будет управлять и хранить несколько объектов моего конкретного типа и включать некоторые вспомогательные методы. Я нахожу это удобным для тех случаев, когда кому-то еще приходится работать с моим кодом.
Я думаю, что этот вопрос очень субъективен в том смысле, что нет ответа, который был бы всегда правильным. Иногда достаточно просто передать обратно массив, и нет необходимости создавать дополнительный класс. Иногда дополнительный уровень абстракции делает что-то гораздо более понятным для пользователя.