如何确定对象是否为 PORO?

tim*_*xyz 5 ruby oop

当我查看一个对象(在终端或 rails 控制台中)时,如何确定它是否为 PORO?

我理解这意味着一个对象只是 Ruby(不依赖于 Rails)。但在实际意义上我不明白。

比如我打印puts @a_form.inspect到控制台的时候,是不是PORO?

#<AForm:0x007fdbf9b33468 @a=#<A id: 1,...
Run Code Online (Sandbox Code Playgroud)

我已经做了很多谷歌搜索,但没有找到一个更简单的答案,包括与非 PORO 对象相比的示例。

谁能给出一个实际的比较?

如果这是一个超级新手问题,请提前道歉。

Hol*_*ust 10

PORO(代表Plain Old Ruby Object)和非PORO 之间的区别不是技术性的。所有对象在技术上都是 Ruby 对象。

相反,在谈论像 Rails 这样的大型框架时,有时会使用术语 PORO,这些框架倾向于使用“大”、“复杂”的对象(如 ActiveRecord 模型)来实现其大部分逻辑。这些大对象往往包含大量的逻辑和(通常是隐含的)定义的行为和约定。

在谈论 PORO 时,通常这样做是为了与这些大对象区分开来,而是鼓励使用更小的、特定的类/对象来构建您的业务逻辑,这可能看起来更简单。这些对象通常不需要像 ActiveRecord 模型那样由稳定存储支持,而只是包含动态数据并定义业务逻辑(通常称为应用程序的行为),而无需使用来自复杂框架的大量工具。

但同样,这不是一个严格的技术区别,甚至不是一个明确的界限。这是一种社会区别,通常旨在鼓励在单一框架之外进行思考。

至于术语本身,它相对较新,并且(您现在可能已经猜到了)几乎没有任何实际意义。它最近流行起来,人们抱怨现在一些大型 Rails 应用程序倾向于采用的结构(例如精益控制器、胖模型,您将整个业务逻辑放入 ActiveRecord 模型中。因此,该术语主要用作与这些胖模型的区别)楷模。


tad*_*man 6

真的没有像“普通的旧 Ruby 对象”这样的东西,因为一切都是对象,所以没有“普通”的概念。你如何定义非普通?

这与 JavaScript 不同,JavaScript 有简单的对象原语,然后使用 ES6 之类的东西更正式地声明其他原语 class构造。作为容器传递的 JavaScript 对象是一种常见模式。Ruby 中的等效项将传递复杂的数据结构,例如具有潜在嵌套元素的 Hash。

如果你想知道一个对象的类:

@a_form.class
Run Code Online (Sandbox Code Playgroud)

如果你想知道它继承了什么:

@a_form.superclass # Immediate parent
@a_form.class.ancestors # All base classes and mixin modules
Run Code Online (Sandbox Code Playgroud)

在 Ruby 中有匿名类,那些用Class.new和用它们创建的对象是你所能得到的最简单的,但它们仍然是一流的对象。