9

我注意到在 Ruby 中,供应商 API 将结果作为数组传回是很常见的?普通的旧对象(如 Java 中的 POJO)不应该更像一个标准吗?如果我编写自己的库,我不应该使用POJOs POROs 吗?

4

4 回答 4

4

我认为数组与对象是错误的二分法。

这是完全合理的,当一个 API 调用返回一个以上的东西时,它是一个数组的形式(数组是一个相当简单的对象,因此在 Ruby 中可以说是一个“PORO”)

编辑:回应您的评论:

您引用的示例(http://github.com/cjheath/geoip)返回一个不同项目的数组。我同意这不一定是返回数据的最佳格式。在那种情况下,我会认为带有合理命名键的哈希会是一个更好的结构。

正如 John Topley 所说,Ruby 的 OO 特性意味着人们不必发明诸如“PORO”之类的术语,因为哈希非常简单。

于 2010-02-12T13:52:02.550 回答
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
于 2010-02-12T14:53:05.600 回答
2

这些结果数组包含什么?答案是在 Ruby 中它们包含对象,因为 Ruby 中的一切都是对象。

Java 世界中的 POJO 是对企业 Java(例如 EJB)对世界造成的一些复杂性的反应。引用创造这个词的 Martin Fowler 的话:

“我们想知道为什么人们如此反对在他们的系统中使用常规对象,并得出结论,这是因为简单的对象没有一个花哨的名字。所以我们给了他们一个,它很受欢迎。”

幸运的是,在 Ruby 中,人们只练习面向对象编程而不需要围绕它发明术语是很自然的。

于 2010-02-12T14:00:42.763 回答
2

我个人几乎在我写的任何不是完整的一次性脚本的东西中都使用 PORO。

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

我认为这个问题是非常主观的,因为没有一个总是正确的答案。有时只需传回一个数组就可以了,无需创建额外的类。有时,额外的抽象层次会让用户更清楚。

于 2010-02-12T14:21:07.760 回答