2007年2月22日 星期四

目前對Ruby的觀感,以alias的功能為例

有很多特別的東西值得一提,但這些東西都太簡單太容易看到,稍微學一下Ruby就會體會到,反而覺得沒必要特意提。

很多優點要有些概念才能明白到底有多方便,舉例來說,alias可以改變method,而不用inheritance去改。原本OOPL裡會用 interface/class 先包好,在良好的設計下,可以簡單地抽換行為,比方對method做log。注意,要有良好的設計,還有隨之的規範

一個簡單的應用是,若我們能改寫輸出方法,我們就能記錄輸出訊息,方便Unit Test,而不用改寫被測試的 函式/物件。

視語言的不同,可以用巨集或wrapper object實作,這裡通稱 fake_puts。fake_puts會記錄輸出的字串,再真的呼叫 printf / cout / System.out,於是我們用的所有物件得先遵守這個設計,使用fake_puts,而不是直覺的 printf / cout / System.out。

這有很多問題:不方便、已寫好的code很難改、沒有source code無解,但Ruby可以直接改變既定的method,非常簡單

$record = [] alias old_puts puts def puts(str) $record << str old_puts str end

只要在程式裡加入上段的code,所有程式不用更動,行為照舊,而且所有用puts輸出的訊息都有存到形態為Array的全域變數$record。Ruby就是這麼簡單又強悍。

3 則留言: