Это все объекты, все время. Ключ в том, имеет ли возвращаемый объект поведение, связанное с ним. Это нормально сделать:
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