2016-08-24 53 views
1

當我查看一個對象(在終端或導軌控制檯中)時,如何確定它是否是PORO?如何確定對象是否爲PORO?

我明白這意味着一個對象只是Ruby(不依賴於Rails)。但我從實際意義上不理解。

例如,當我將puts @a_form.inspect打印到控制檯時,它是否是PORO?

#<AForm:0x007fdbf9b33468 @a=#<A id: 1,... 

我已經做了很多谷歌搜索,但沒有發現有比較非PORO對象的示例答案更簡單。

任何人都可以給一個實際的比較?

如果這是一個超級新手問題,請提前道歉。

回答

2

真的沒有像任何事物那樣的「普通的舊Ruby對象」,從字面上看,一切都是對象,所以沒有「普通」的概念。你會如何定義非簡單的?

這與JavaScript不同,其中有簡單的對象基元,然後使用ES6 class構造等更正式地聲明瞭其他語言。作爲容器傳遞的JavaScript對象是常見模式。 Ruby中的等價物將傳遞像Hash這樣的複雜數據結構與潛在的嵌套元素。

如果你想知道一個對象的類:

@a_form.class 

如果你想知道這是什麼繼承:

@a_form.superclass # Immediate parent 
@a_form.class.ancestors # All base classes and mixin modules 

匿名類在Ruby中,那些由與Class.new,用這些創建的對象是儘可能簡單,但他們仍然是一流的對象。

2

PORO(代表Plain Old Ruby Object)和非PORO之間的區別不是技術性的。所有對象在技術上都是Ruby對象

相反,術語PORO有時用於討論像Rails這樣的大型框架,它傾向於在其大部分邏輯中使用像ActiveRecord模型那樣的「大」,「複雜」對象。這些大對象往往包含大量的邏輯和定義的行爲。

當談到PORO時,它通常要區分這些大對象,並鼓勵使用更小的特定類/對象來構建業務邏輯。這些對象通常不需要穩定存儲的支持,因爲ActiveRecord模型通常只包含動態數據並定義業務邏輯(您通常稱爲應用程序的行爲)。

但是,這不是一個技術上的區別,或者是一個界限分明的區別。這是一種社會區別,一般旨在鼓勵在單一框架之外進行思考。至於這個術語本身,它是相對較新的,並且(你現在可能已經猜到了)完全沒有任何實際的硬性含義。它最近很受歡迎,人們抱怨大型Rails應用程序現在傾向於使用結構(精簡控制器,胖模型),即將整個業務邏輯放入ActiveRecord模型中。因此這個術語大多隻是作爲與這些脂肪模型的區別。

相關問題