What have you found for these years?

2008-07-28

DataMapper source code

為了寫以下的 dm-mapping[0][1], 理所當然要去翻他的 source code.
基本上,我是非常討厭以下這個狀況:

> sudo gem install data_mapper

Successfully installed dm-core-0.9.3
Successfully installed dm-aggregates-0.9.3
Successfully installed dm-migrations-0.9.3
Successfully installed dm-serializer-0.9.3
Successfully installed dm-timestamps-0.9.3
Successfully installed dm-validations-0.9.3
Successfully installed dm-cli-0.9.3
Successfully installed dm-is-tree-0.9.3
Successfully installed dm-observer-0.9.3
Successfully installed dm-types-0.9.3
Successfully installed hoe-1.7.0
Successfully installed data_mapper-0.9.3
12 gems installed

媽呀,這根本是洗螢幕嘛,我還沒列出 ri 和 rdoc 咧。
而且當我試完,發現他不合我的胃口,要砍掉時,要怎麼砍啊?

> sudo gem uninstall dm-*

這樣不行吧...
不過我是剛剛才發現,其實可以用 regular expression!
我一直以為 shell 都是要用 glob 的 @@
這證明果然 rubygems 是設計最精良的 package management...?

> sudo gem uninstall "dm-\w*"

Select gem to uninstall:
1. dm-adjust-0.9.3
2. dm-aggregates-0.9.3
3. dm-cli-0.9.3
4. dm-core-0.9.3
5. dm-migrations-0.9.3
6. dm-more-0.9.3
7. dm-observer-0.9.3
8. dm-querizer-0.9.3
9. dm-serializer-0.9.3
10. dm-shorthand-0.9.3
11. dm-timestamps-0.9.3
12. dm-types-0.9.3
13. dm-validations-0.9.3
14. All versions
>

所以大概是不用擔心 uninstall 與 clean 的問題,
只是 gem list 時會被洗螢幕吧 XD
還有 $LOAD_PATH 會變得長許多... 雖然這應該差異不大。

總之,從 merb 轉型成這種模式後,由於 data_mapper 與
merb 是好朋友,所以 data_mapper 也開始轉變成這種形式,
甚至連 version number 都跟 merb 同步了。雙方也在合併一些
共通的程式碼,未來大概會釋出 extlib, 兩邊都會 dependent on extlib 吧。
那大概就類似 active_support 的地位。

乍看之下,分這麼多實在是很討厭。不過真的去閱讀 data mapper 的程式碼後,
發現這個方式其實對於擴充與組合而言,反倒是非常方便。
我一直很討厭 rails 的 plugin, 因為他有點像是強迫我在每個
rails project 裡安裝相同的 plugin, 然後分開 update.
如果說用 symbolic link 的話,這也未免太麻煩了...

當然 rails 這樣做方便我們做 customize, 不過,我覺得真的有需要
customize 到 source code level 的話,表示該 plugin 做得不好,
需要 dirty hack, 或是,根本就是 plugin user 太懶只會做 dirty hack.
有一點點變相鼓勵 dirty hack 的感覺...

而 merb/data_mapper 的這種方式,就是希望 plugin 也能以 gem 的方式
release, 使得 gem install 就解決,不用 per project per plugin,
直接利用偉大的 rubygems 做 package management, 豈不是皆大歡喜?

再加上,rails 裡處處可以看到一兩千行的 source code,
在 data_mapper 裡,最長大概就四五百行吧?每個檔案幾乎都很小,
所有的東西都良好地組織在一起。我要加上 dm-mapping 的功能,
也真的是按照 ruby 的方式,直接打開 class/module 加上去即可。

雖然剛開始我碰到了一些 require 順序的問題,
這是 dm-core 內部避免重複 require 的作法,
我個人是不太贊成這樣寫,畢竟 require 本身就有判斷了,
額外加上的這個判斷,使得 dm-core 的 adapater 一定要先 require.
為此我也 trace 了一陣子才發現這個問題...

不過至少,他整個架構我一看就知道東西應該擺在哪,
而不是像 rails 我必須東翻西找,最好才發現原來神秘的東西在這...。

我真的覺得,就模組化而言,其實 rails 做得不算差了。(更髒更亂的多得是)
但跟 data mapper 一比,似乎還差了一個層次...

但 rails 成長與改變的速度也真的是非常快。如果 rails developer
有注意到這件事,試著往這方向前進的話,相信 rails 也能達到這種水準。
就看 rails 有沒有心往這方向前進了...

如果沒有,我想我換 framework 就勢在必行了。只是現階段還沒有一個
成熟度有辦法跟 rails 相比,production 下還是需要 rails.

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0