What have you found for these years?

2008-03-24

沒有 tr1/functional 是不行的

以前我寫 generic function callback 都是用 template...
一直覺得這樣很好。不過引入 template 的後患實在有點太多了...
現在我發現,其實全部用 std::tr1::function 取代掉最好!

就先不考慮效能了,template 讓 code 與 code 之間 dependency 實在會變太大,
導致除了需要不斷重新 compile 令人厭煩外,circular include dependency,
無法做 runtime binding (shared code), 等等,缺陷真的不少。
好處只有:跑得快。但是 object code 也會變大...

現在有了 std::tr1::function!! (boost::function) 一切都解決了!
再加上 std::tr1::bind (boost::bind), std::tr1::mem_fn (boost::mem_fn),
幾乎想做什麼奇怪的 binding 都做得到!

相較之下,std::bind1st, std::bind2nd, std::mem_fun, 等等,根本就是垃圾...

看看這段 code...

    body_->onPress( &(ctrl::Input::getInputByIndex(1)->trig1()) ) =
std::tr1::bind( &ViewSprite::check_cube_and_do,
std::tr1::mem_fn(&model::Cube::go_exploding), cube_ );


沒有 bind, mem_fn, function 的話,這邊大概會複雜到爆炸,
而且保證會有無數重複的程式碼....

上面這段還是我直覺寫下來的,幾乎沒有思考。想做到等價的效果,
沒有那三樣東西,不知道要花多少時間?光是 member pointer 就搞死人了吧...

這次程式的複雜度真的不是蓋的...
有趣的是,這種複雜度一次絕對寫不出來,必須先寫簡單的,
然後再慢慢改進,最後就能演化到這種恐怖的程度。

不好維護?我完全不這麼覺得。因為我要加新功能幾乎都是一兩個小時內
可以測試到正確無誤。程式是很複雜,但是加功能時,不需要去看的地方,
根本就不用去動他。只需要專注在自己要解決的問題上即可。

像是剛剛要加 be_broken 等 hook, 我把 model 和 presenter 的地方
處理完畢之後,就可以完全丟到一邊,專心寫 ViewSprite 即可。

可惜的是,static typing 的 language, 重複的程式碼似乎是無法避免的。
c++ 感覺已經不錯了,之前寫 haskell 真的是需要非常多重複的動作...
不過和 c++ 重複的地方不一樣,算是各有各厲害之處吧...
(雖然其實領域不同根本無法比較........)

java 就得要瘋狂重複了..............................
非常瘋狂,非常...
因為他 abstraction 能力非常低落。

我在想要不要把 c++ 這些重複的地方拆成 ruby code,
以後有空的話,也許吧。現階段有點懶得弄,畢竟 copy & paste 幾秒就解決了,
寫成 ruby code 還要一點時間,又不能保證一定比較好。

還是先趕工...

8 retries:

Plumm said...

其實呀, 寫寫 Ruby Java 之後, 偶爾還是要碰一下 C++ 這類的 硬語言 的, 雖然說好寫的語言很好寫, 但太久習慣於好寫時, 一下子碰上難寫的會不太適應 :QQ 雖然最近看 C++ 排名好像又掉了, 但我覺得這個是不可放棄的一環...

另外就是最近 Vanguard 玩太瘋了, 要檢討一下 @.@

godfat 真常 said...

你可以抓下來 build 看看,光要 build 應該就很費力了吧 XD

http://shooting-cubes.googlecode.com

打遊戲沒啥不好... 我想打都沒有打 @@

Plumm said...

看到這 build 就有點懶得 build 了, 每次軟體要 build 程序就一堆 @.@

不是, 我身體不好, 無法連續玩遊戲玩太久(當然別的事也一樣), 這次玩Vanguard連著玩就不舒服了...所以我基本上是很難沉迷的...@.@

山邊美溪 said...

受不了了,投書到部長信箱(教育部)去了。

希望能有個好結果。

godfat 真常 said...

> 看到這 build 就有點懶得 build 了, 每次軟體要 build 程序就一堆 @.@

這可以練功啊 :p

> 這次玩Vanguard連著玩就不舒服了

這樣就真的不好了... XD
不過總覺得難免...

> 受不了了,投書到部長信箱(教育部)去了。

XDDDD
應該是不太可能有什麼好結果
沒回應的可能性多些 XD

Plumm said...

>受不了了,投書到部長信箱(教育部)去了。
是投什咩內容呀??

山邊美溪 said...

投書內容大概如下:



日前夜裡惡夢連連,一覺醒來、大汗淋漓,旋即上網,赫然得知貴部網站竟登入不能也。敝人自幼喜好詩書金石,一日不讀書,便覺語言無味;三日不上教育部字典,更是輾轉難眠。長言道:天將降大任於斯人也,必先苦其心志,勞其筋骨,餓其體膚。敝人且本著孔孟之精神飢餐露宿、四處搜索proxy,無奈……


抱歉,開玩笑的。

主要就是說明問題(包跨很多美國朋友都表示尚不了教育部網站),然後問他們是不是在封國外Ip還是怎麼樣。

godfat 真常 said...

XDDD
很久不見這種胡說八道了
閒情逸致少好多 =_=b

不過部長怎麼可能知道這種事... XD

Post a Comment

All texts are licensed under CC Attribution 3.0