【问题标题】:Plain Old Objects in Ruby?Ruby 中的普通旧对象?
【发布时间】:2011-01-16 03:53:10
【问题描述】:

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

【问题讨论】:

    标签: ruby oop pojo


    【解决方案1】:

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

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

    编辑:回应您的 cmets:

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

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

    【讨论】:

    • 否,因为您需要参考 API 文档来确定在哪个位置传回哪个值。如果它在自定义对象中,则不必重新引用 rdoc。
    • 您实际上指的是一个数组,其中在数组的预定义点有不同的类实例?你能链接到你所指的那种事情的例子吗?
    • github.com/cjheath/geoip ....这些函数似乎会受益于返回自定义对象而不是数组中的变量数量的字符串
    • 好的,我现在知道了。在这种情况下,我认为带有合理命名键的哈希将是一种改进。
    【解决方案2】:

    一直都是对象。关键是返回的对象是否具有与之关联的行为。这样做很好:

      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
    

    【讨论】:

      【解决方案3】:

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

      Java 世界中的 POJO 是对企业 Java 对世界造成的一些复杂性的反应,例如EJB。引用创造该术语的 Martin Fowler 的话:

      “我们想知道为什么人们如此 反对在他们的 系统,并得出结论,它是 因为简单的物品缺乏花哨 姓名。所以我们给了他们一个,它是 非常受欢迎。”

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

      【讨论】:

      • 我想我真正要问的是是否有更好的方法来返回命名属性以及为什么不更多地使用它,所以也许我应该重新问这个问题!
      • 一个原因可能是 HTTParty 之类的 Gem 使得在 Ruby 中包装 Web 服务并免费获得围绕返回的 JSON 或 XML 的轻量级对象包装器变得非常容易。
      【解决方案4】:

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

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

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

      【讨论】:

      • 这正是我想知道的。感谢您添加您的意见。我不认为这是主观的,因为我想看看别人做了什么,并考虑到所有这些来为我自己的启迪......
      猜你喜欢
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多