ruby object model (1)
有屎沒有盅是我的座右銘。
承上,meta-class 的部份,可以看到在圖中,
有非常多的白箭頭指向 MetaClass. 就如投影片中
第三個圈的部份,所有所有的 meta-class,
都是 MetaClass 的 instance. 也可以想像成,
*1 ~ *∞,
Set1 ~ Set∞,
meta-class ~ meta-meta-...-class,
其實都是 MetaClass 的 instance.
也就是說,看起來像是無窮 meta 的 ruby,
事實上全部會收斂回 MetaClass.
在 class 裡,class 怎麼繼承,meta-class 就會有相對應的繼承。
然而在 meta-meta-class 裡,卻不會有相應的繼承體系。
所以 ruby 雖然可以有無窮的 meta-class, 卻只有有限的 object model.
整個圖形畫出來,除了錯綜複雜外,事實上也是有些詭異的。
例如 Class 是自己的 instance, 而 Object 是 Class 的
instance, 也同時是 Class 的 parent!
ruby object model 攤開來看,充滿了矛盾。而這卻是符合直覺的
有效方法,因為人類的直覺本來就充滿著矛盾...
這樣的 model, 也沒辦法在 static time 建立,
必須分好幾個步驟,才能一一把圖形的線牽好,因為裡面有許多的
circular/mutual dependency...
我想這也是為什麼 rubinius 有個 delta runtime 的原因之一。
*
此外,rubinius 也額外增加了 IncludedModule 這樣東西。
因為我們不能讓被 include 的 module 一起進去每一個 class/module 的
繼承體系中。由於 method dispatch 只依靠著 meta-class 與
super-class, 因此 module 也必須是某種 parent.
因此,IncludedModule 就是這樣的媒介,他有 reference 指回
原本的 module, 同時也有著獨特的 super-class, 他是 includer 與
includee 的媒介,藉此生出另一個獨一無二的繼承體系。
*
ruby object model 的設計方式是,先想我們希望有什麼結果,
再去把東西堆起來迎合我們要的這個結果。所以儘管表面上看起來,
符合我們的直覺,實際上實作起來卻是非常複雜且糾結的結構。
而事實上 MRI 與 Rubinius 的 object model 也不盡相同。
上次測試,IncludedModule 與 MetaClass 的部份,
在某些情況下就有完全不同的運作結果。不過我是站在 rubinius 這邊,
我覺得 rubinius 跑出來的結果,比較符合我的預期 :)
rubinius consistency 比較高!
end of story!
btw, 這樣的 model 有個地方嚴重違反
Liskov substitution principle,
就是 Class 根本就不是一個 Module.
非常嚴重的違反... Class 跟 Module 事實上根本沒什麼關係。
比較好的設計是,另外有個 base class 為他們共同祖先,
Class 與 Module 應該是兄弟姊妹的關係,不是父母子女。
0 retries:
Post a Comment
Note: Only a member of this blog may post a comment.