Ruby中的普通旧对象?

时间:2010-02-12 13:33:40

标签: ruby oop pojo

我注意到在Ruby中,供应商API将结果作为数组传回是很常见的吗? Plain Old Objects(如Java中的POJO)不应该更像标准吗? 如果我写自己的库不应该使用 POJOs PORO?

4 个答案:

答案 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,这不是一个完整的一次性脚本。

我发现自己经常创建一个数据持有者类,它可以管理和保存我特定类型的多个对象,并包含一些帮助方法。当其他人也必须使用我的代码时,我觉得这很方便。

我认为这个问题非常主观,因为没有一个总是正确的答案。有时只是传回一个数组很好,没有必要创建一个额外的类。有时,额外的抽象级别会使用户更加清楚。