Inside Rails
前一陣子為了擴充 rails 的功能,翻看了一些 rails 的 source code.
在多數語言中,例如 c/c++, 這樣的擴充通常必須修改 lib source code,
然後整個 rebuild 一次。如果說想要真的大翻修,其實這樣也 ok,
with git, 或許也能很方便地 merge 回最新 stable 版。
但是如果只是要改一點小東西,這樣就顯得非常麻煩。
就像之前 cubeat 上的 irrlicht, 不得不 fork 一份,
要 update irrlicht 時就需要一些方法,不能直接覆蓋。
不過在 ruby 裡,quick and dirty 實在太容易了,幾乎任何東西
都能輕易地 monkey patch. 雖然之前碰到沒有 un-include 或
un-extend 的問題... 至少大部分都能隨便 patch,
於是不需要修改 library 本身,application 本身仍然能夠是在
官方 release 的 library 上 portable.
各有優缺點啦。只是 ruby 多個 monkey patch 的選擇。
其實我想說的是,我總覺得 rails 的程式寫得,該怎麼說呢,
非常具有某種形式的色彩在內吧?當然,每個程式多少都會這樣,
但感覺 rails 就特別明顯。
當然在還沒把整個 rails source code 讀完前,不能下什麼評論,
但是我真的邊讀邊懷疑 rails 需要這麼複雜的架構嗎?感覺內部有不少
inconsistent, 尤其在看到這個的時候:
http://api.rubyonrails.org/classes/HashWithIndifferentAccess.html
不是有 symbolize_keys 可以用嗎?為什麼又需要這個?搞不太懂...
有的地方用 symbolize_keys, 有的地方又用 with_indifferent_access?
當然 source code 都放在那,仔細讀下去應該可以知道原因。
只是就介面看起來,Hash#symbolize_keys 和 Hash#with_indifferent_access
是沒什麼差別。而後者,api documents 裡好像沒寫?
另一方面,controller 中的 params 和 request. ??? parameter
又不太一樣。還有大量使用 class variable, 也讓我滿感冒的。
嗯,還有 AbstractRequest 中用了不少 global variable, $1, $2, etc.
這樣當然不 thread-safe? 我以為堅持不用 $1, $2 等等是基本的?
不過反正我也只是要 monkey patch rails, 只要他沒有 bug, 夠穩定,
內部要怎麼寫,我也沒什麼意見就是了。這也是為什麼也只是在這邊碎碎念
而不是真的去看他 source code 怎麼寫的....
總而言之,我覺得 ruby 會比 rails 穩定是理所當然的?
儘管 ruby 1.9 的 bug 還是一堆,離 production 應該還早...
2.0 大概又更是遙遙無期吧。希望不會走上 Perl 6 的老路...
另外不知道 Python 3 發展得如何了?這似乎是最有希望的? XD
0 retries:
Post a Comment
Note: Only a member of this blog may post a comment.