德政
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的新輸入法架構,也相當依賴這一件事情的正確性。
lukhnos :: Feb.14.2007 :: tekhnologia 技術或者藝術 :: 1 Comment »
One Response to “德政”
C++用 null object 模式也蠻容易做到這個功能。