纯 Ruby 对象?

9

我注意到在Ruby中,厂商API通常将结果作为数组返回。难道不应该采用类似Java中的Plain Old Objects(POJOs)作为标准吗?如果我编写自己的库,我应该使用POROs而不是POJOs

4个回答

4
我认为数组与对象之间的对立是错误的。当API调用返回多个东西时,使用数组形式是完全合理的(而且数组是一个相当简单的对象,在Ruby中可以被认为是'PORO')。
编辑:回应你的评论:
你提到的示例(http://github.com/cjheath/geoip)返回不同项的数组。我同意这不一定是以最佳格式返回数据的方式。在这种情况下,我认为具有明智命名键的哈希表将是更好的结构。
正如John Topley所说,Ruby的面向对象性质意味着人们不必发明"PORO"这样的术语,因为哈希表就是你能得到的最简单的东西。

1
不行,因为你需要参考API文档来确定哪个值被传回到了什么位置。如果它在一个自定义对象中,你就不必回头查看rdoc了。 - Zombies
你是指在数组中预定义不同类实例的情况吗?你能提供一个类似的示例链接吗? - DanSingerman
似乎这些函数从返回一个字符串数组变为返回自定义对象会更有益。http://github.com/cjheath/geoip - Zombies
1
好的,我现在明白了。在这种情况下,我认为使用一个带有合理命名键的哈希表会更好。 - DanSingerman

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
那些结果数组包含什么?答案是在Ruby中它们包含对象,因为Ruby中的所有东西都是对象。Java世界中的POJO是对企业Java(例如EJB)带来的某些复杂性的反应。引用创造该术语的Martin Fowler的话:“我们想知道为什么人们如此反对在他们的系统中使用常规对象,并得出结论,这是因为简单的对象缺乏花哨的名称。所以我们给了它们一个名字,而且这个名字非常流行。”幸运的是,在Ruby中,人们一直自然地进行面向对象编程,无需发明术语。

1
我想问的是,是否有更好的方法来获取命名属性并返回它们,为什么它没有被更广泛地使用,也许我应该重新提出这个问题! - Zombies
1
有一个原因可能是像HTTParty这样的宝石(Gems)使得在Ruby中包装Web服务并免费获得返回的JSON或XML的轻量级对象包装器变得非常容易。 - John Topley

2
我个人在编写非完全一次性脚本时几乎都使用POROs。
我经常创建数据持有者类型的类,该类可以管理和保存多个特定类型的对象并包含一些辅助方法。我发现这对于其他人使用我的代码也很方便。
我认为这个问题非常主观,因为没有一个总是正确的答案。有时只需返回一个数组就可以了,没有必要创建额外的类。有时候,额外的抽象层使用户更加清晰。

这正是我所想知道的。感谢您提供意见。我认为这并不主观,因为我试图看看其他人做什么,并考虑这些内容以增进自己的学识... - Zombies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接