【发布时间】:2011-01-16 03:53:10
【问题描述】:
我注意到在 Ruby 中,供应商 API 将结果作为数组传回是很常见的?普通的旧对象(如 Java 中的 POJO)不应该更像一个标准吗? 如果我编写自己的库,我不应该使用 POJOs POROs 吗?
【问题讨论】:
我注意到在 Ruby 中,供应商 API 将结果作为数组传回是很常见的?普通的旧对象(如 Java 中的 POJO)不应该更像一个标准吗? 如果我编写自己的库,我不应该使用 POJOs POROs 吗?
【问题讨论】:
我认为数组与对象是错误的二分法。
如果一个 API 调用返回一个以上的东西,它是一个数组的形式,这是完全合理的(数组是一个相当简单的对象,因此在 Ruby 中可以说是一个“PORO”无论如何)
编辑:回应您的 cmets:
您引用的示例 (http://github.com/cjheath/geoip) 返回不同项目的数组。我同意这不一定是返回数据的最佳格式。在那种情况下,我会认为带有合理命名键的散列会是一个更好的结构。
正如 John Topley 所说,Ruby 的 OO 特性意味着人们不必发明诸如“PORO”之类的术语,因为哈希非常简单。
【讨论】:
一直都是对象。关键是返回的对象是否具有与之关联的行为。这样做很好:
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
【讨论】:
这些结果数组包含什么?答案是在 Ruby 中它们包含对象,因为 Ruby 中的一切都是对象。
Java 世界中的 POJO 是对企业 Java 对世界造成的一些复杂性的反应,例如EJB。引用创造该术语的 Martin Fowler 的话:
“我们想知道为什么人们如此 反对在他们的 系统,并得出结论,它是 因为简单的物品缺乏花哨 姓名。所以我们给了他们一个,它是 非常受欢迎。”
幸运的是,在 Ruby 中,人们只练习面向对象编程而不需要围绕它发明术语是很自然的。
【讨论】:
我个人在几乎所有我写的不是完整的一次性脚本的东西中都使用 PORO。
我发现自己经常创建一个数据持有者类型的类,该类将管理和持有我的特定类型的多个对象并包含一些辅助方法。当其他人也必须使用我的代码时,我发现这很方便。
我认为这个问题非常主观,因为没有一个永远正确的答案。有时只需传回一个数组就可以了,无需创建额外的类。有时,额外的抽象层次会让用户更清楚。
【讨论】: