最近更新: 2007-02-14

什麼是 Reflection ?

Reflection ,一般譯為「反射」。但我一般說這是 讓 object 看到自己的外貌的功能(PHP5 的動態函數/行為調用效率測試) 。這說法似乎和「反射」一詞扯不上關係。事實上,我稱這種能力為「自識」能力。

藉由翻譯《To Ruby From PHP》之機會,我整理了我的觀點。我認為 Reflection 其實是 Java/C# 等缺乏個體自識能力之語言才有的詞彙。因為它們的個體不具自識能力,當一個體欲觀察自身輪廓時,必須先配置另一個可反射對象輪廓的個體,該個體才能藉由觀察反射體而得知自身輪廓。而優秀的動態語言 (如 Ruby, Python) 中之個體,不需要藉助其他個體反射自身就能察知自身輪廓。

以現實事物為喻,在 Java/C# 中的個體,要拿一面鏡子 (an instance of reflection class) 擺在自己面前,藉由鏡子反射的影像才能看到自己有幾隻手、幾雙腳。而 Ruby, Python 中的個體,不需要靠鏡子就能知道自己有幾隻手、幾雙腳,它們有與生俱來的能力可以察知自身狀態,故我稱之為「自識」能力。談 Ruby, Python 可能讓多數人覺得陌生,我用 JavaScript 這個大家可能都會寫個幾行的語言為例。 JavaScript 這個 Java 的冒名雙生兄弟之自識能力都比 Java 優秀。如下所示:

var obj = {
    'head': 1,
    'eye':  2,
    'mouth':1,
    'hand': 2,
    'foot': 2,
    'say': function() { alert('hello'); }
}

for (var p in obj) {
    if (typeof obj[p] == 'function')
        obj[p]();
    else
        alert('I have ' + obj[p] + ' ' + p + (obj[p] > 1 ? 's' : ''));
}

就這麼簡單囉。在《PHP5 的動態函數/行為調用效率測試》中,則是比較在 PHP5 中用 Reflection class 和傳統函數之執行效率。在 PHP5 , Reflection class 不論使用方式與效率,都不及傳統函數。在動態語言中,個體有自識能力,所以 reflection 顯得多餘了。

相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/2728221.html

樂多舊回應
HACGIS@gmail.com(tokimeki) (#comment-16043575)
Fri, 21 Mar 2008 11:46:10 +0800
最近碰到一個分割程式功能的問題,不得已必須用到反映的功能,寫了一個簡單的抽象插件類別
http://blog.pixnet.net/HACGIS/post/15612808
不知道你有沒有更好的解法?
未留名 (#comment-16074751)
Tue, 25 Mar 2008 18:32:58 +0800
我的回答有些長,所以我另外寫了一篇 blog:
關於分割程式功能以及 mix-in 和 include