我注意到在Ruby中,供应商API将结果作为数组传回是很常见的吗? Plain Old Objects(如Java中的POJO)不应该更像标准吗? 如果我写自己的库不应该使用 POJOs PORO?
答案 0 :(得分:4)
我认为数组与对象是错误的二分法。
完全合理的是,API调用返回多个东西,它是以数组的形式(并且数组是一个相当简单的对象,因此可以说是'PORO',在Ruby中反正)
编辑:回复您的评论:
您引用的示例(http://github.com/cjheath/geoip)返回不同项目的数组。我同意这不一定是返回数据的最佳格式。在这种情况下,我会认为具有合理命名键的哈希将是更好的结构。
正如John Topley所说,Ruby的OO本质意味着人们不必像'PORO'那样发明这样的术语,因为哈希就像你能得到的一样简单。
答案 1 :(得分:3)
它始终是所有物体。关键是返回的对象是否具有与之关联的行为。这样做很好:
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 :(得分:2)
这些结果数组包含哪些内容?答案是在Ruby中它们包含对象,因为Ruby中的所有东西都是对象。
Java世界中的POJO是对企业Java对世界造成的一些复杂性的反应,例如: EJB的。引用创造这个词的Martin Fowler:
“我们想知道为什么人们如此 反对使用常规对象 系统并得出结论认为是 因为简单的物体缺乏想象力 名称。所以我们给了他们一个,就是这个 很好地接受了。“
幸运的是,在Ruby中,人们一直很自然地只需要实现面向对象的编程,而无需在其周围发明术语。
答案 3 :(得分:2)
我个人在我写的几乎所有东西中都使用PORO,这不是一个完整的一次性脚本。
我发现自己经常创建一个数据持有者类,它可以管理和保存我特定类型的多个对象,并包含一些帮助方法。当其他人也必须使用我的代码时,我觉得这很方便。
我认为这个问题非常主观,因为没有一个总是正确的答案。有时只是传回一个数组很好,没有必要创建一个额外的类。有时,额外的抽象级别会使用户更加清楚。