The Old Blog Archive (Traditional Chinese), 2004-2009

德政

Objective-C 有一個相當特別、被某藍同學稱為「德政」的設計:

送 message 給 nil ,就會得到nil

相較於其他語言(C++對null pointer call member function會爆炸、很多語言則會哇哇叫),Objective-C 的設計相當有意思。這個決定──”method returns nil when the receiver is nil”──隱含的意思是,「沒有例外事件」(no exception thrown),也就是Objective-C會沉默地忽略丟東西給nil所發生的事。

這樣有什麼好處呢?簡言之,就是節省了大量錯誤檢查所需的程式碼。而且,如果程式安排得宜,例如 C 依靠 B 的結果,B 依靠 A 的結果,那麼只要 A 這一步得到 nil 、B C 兩步的程式碼就一路等於變成了 no op,什麼事情都不會發生。只要最後再檢查 C 這一步的結果是否為 nil ,就知道 A B C 三步是否一次執行完畢。

唯一要注意的,那就是相較於 std c lib,printf(“%s”, NULL) 會看到 “(null)”,NSLog(nil) 或 NSLog([nil description])是什麼都看不到的。所以當 stderr 上面一片寂靜時,大概就得猜想是不是 A B C 一路 nop 到底了。

我目前唯一用到(也不得不用)exception handling的地方,只有檢查remote object是否還存在。如果丟了message給某個remote object,結果catch到奇怪的exception,就表示remote object已經不在了,要重新跟remote process要它對外販售的物件(vended object)。OS X 10.5的新輸入法架構,也相當依賴這一件事情的正確性。

One Response to “德政”

  1. on 23 Feb 2007 at 12:47reborn2266

    C++用 null object 模式也蠻容易做到這個功能。