Ruby中的普通旧对象?
我注意到在Ruby中,供应商API将结果作为数组传回是非常常见的?普通的旧对象(比如Java中的POJO)不应该更像一个标准吗如果我编写自己的库,我不应该使用POJOs POROs吗?我认为数组和对象是一种错误的二分法 当API调用返回不止一个事物时,它是以数组的形式出现的(数组是一个相当简单的对象,因此在Ruby中可以说是一个“PORO”),这是完全合理的 编辑:回应您的评论: 您引用的示例()返回不同项的数组。我同意这不一定是返回数据的最佳格式。在这种情况下,我会认为一个具有合理命名键的散列将是一个更好的结构Ruby中的普通旧对象?,ruby,oop,pojo,Ruby,Oop,Pojo,我注意到在Ruby中,供应商API将结果作为数组传回是非常常见的?普通的旧对象(比如Java中的POJO)不应该更像一个标准吗如果我编写自己的库,我不应该使用POJOs POROs吗?我认为数组和对象是一种错误的二分法 当API调用返回不止一个事物时,它是以数组的形式出现的(数组是一个相当简单的对象,因此在Ruby中可以说是一个“PORO”),这是完全合理的 编辑:回应您的评论: 您引用的示例()返回不同项的数组。我同意这不一定是返回数据的最佳格式。在这种情况下,我会认为一个具有合理命名键的散列
正如John Topley所说,Ruby的OO特性意味着人们不必发明“PORO”这样的术语,因为散列非常简单。这些结果数组包含什么?答案是在Ruby中它们包含对象,因为Ruby中的所有东西都是对象 Java世界中的POJO是对企业Java(例如EJB)给世界带来的一些复杂性的一种反应。引用创造这个词的马丁·福勒的话: “我们想知道为什么人们会这样 反对在其应用程序中使用常规对象 并得出结论认为 因为简单的物体缺乏想象力 名字,所以我们给了他们一个 很受欢迎。”
幸运的是,在Ruby中,人们总是很自然地只练习面向对象编程,而不需要在其周围发明术语。我个人在我写的几乎所有不是完全一次性脚本的东西中都使用POROs 我发现自己经常创建一个数据持有者类型的类,该类将管理和持有我特定类型的多个对象,并包含一些助手方法。当其他人也必须使用我的代码时,我发现这很方便
我认为这个问题很主观,因为没有一个答案总是正确的。有时仅仅传回一个数组就可以了,不需要创建额外的类。有时,额外的抽象级别会让用户更清楚一些。始终都是对象。关键是返回的对象是否具有与其相关联的行为。这样做很好:
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文档来确定在哪个位置传回哪个值。如果它位于自定义对象中,您就不必再引用rdoc了。您实际上是指在数组的预定义点上有不同类实例的数组吗?你能链接到你所指的这类事情的一个例子吗。。。。我现在明白了,这些函数似乎会受益于返回自定义对象,而不是返回arrayOk中数量可变的字符串。在这种情况下,我认为使用具有合理命名键的散列将是一种改进。我想我真正想问的是,是否有更好的方法返回命名属性,以及为什么没有更多地使用它,所以也许我应该重新问这个问题!一个原因可能是像HTTParty这样的Gems使得用Ruby包装Web服务变得非常容易,并且免费获得一个围绕返回的JSON或XML的轻量级对象包装器。这正是我想知道的。谢谢你的加入。我不认为这是主观的,因为我试图看到别人做什么,并考虑到所有这些对我自己的启迪。。。