Feb. 25 21:20~21:50
今天在Facebook上看到一位朋友提到有人犯了「用例外處理取代控制流程(control flow)」的錯誤。有人把一個用來將性別由「男」或「女」轉成數字的函數checkSex()寫成下面這個樣子:
public void checkSex() throws Exception
if (sex == “男”) {
throw new MaleException();
} else if (sex == “女”) {
throw new FemaleException();
}
checkSex()沒有宣告傳回值,反倒是丟出了例外,用MaleException代表「男」,用FemaleException代表「女」。呼叫checkSex()的函數updateDatabase()大概長成下面這樣子:
public void updateDatabase(){
int sex;
try {
checkSex();
} catch(MaleException e){
sex = 0;
} catch(FemaleException e ) {
sex = 1;
}
…
}
***
以上程式可以通過測試案例,執行結果完全正確。但是,家裡面出了這種code,鄉民們您吞得下去嗎?Teddy真的是孤陋寡聞,可以把例外處理「玩」成這樣,而且還不是學生,而是「業界人士」所寫出的程式碼(疑,會不會是業界人士把案子外包給學生開發出來的程式?!),還真是第一次遇到。
checkSex()至少犯了兩個例外處理的基本錯誤:
- 用例外處理取代控制流程(control flow)
- 用例外取代回傳值
這種錯誤是如此的顯而易見,以至於Teddy在寫《笑談軟體工程:例外處理設計的逆襲》這本書的時候根本就沒擺進去,沒想到還真的有人寫出這樣的程式。書還沒出版,難道要多寫一章…。
***
友藏內心獨白:怎麼搞得好像只要不是文盲都可以來寫程式的說。
其實這位工程師只是為了抒發他心中的不滿而已,每天都寫一樣的code,太無聊了,放些怪怪的code進去整整公司..... :P
回覆刪除可能是惡搞的
回覆刪除Definitely a troll.
回覆刪除早上收到YA先生寄來的一封信,他說有一個叫做Play 的Framework,還真的把 exception 當成 flow control,請參考:http://stackoverflow.com/questions/8500739/why-play-framework-simply-throw-a-new-render-in-controller-class。這個問題還蠻有趣的,真的有人認為可以把 exception handling 當做 control flow 來用,我找時間再來談一下這個議題(等我自己弄懂之後 XD)。
回覆刪除酷 ~ 書哪時要出阿
回覆刪除預計四月出版。
刪除蠻好奇對於該 play framework 使用例外控制流程的原因......
回覆刪除