作者softwind (software everywhere)
看板C_and_CPP
標題Re: [閒聊] 尋求比nest-if更優美的解決辦法
時間Tue Dec 7 00:45:39 2010
※ 引述《awashharp (AwA)》之銘言:
: 最近在寫一些網路server相關的程式,
: 為了要產生足夠詳盡的錯誤訊息給使用者,常常會發現用了很深的nest-if程式…
: 像是:
: if(data != NULL) {
: if(checkData(data) == 0) {
: if(modifyData(data) == 0) {
: if(fireDataChanged(data) == 0) {
: if(saveDataIntoFile(data) == 0) {
: printf("Finally succeed...");
: }
: else printf("Data storage failed.");
: }
: else printf("Observer call failed.");
: }
: else printf("Data modification failed.");
: }
: else printf("Data is invaild.");
: }
: else printf("Data not found.");
下文43.
其實如果你的問題只是 應該如何撰寫or排列這些condition.
語意不變的對應寫法 就是 "衛句"
if( NULL==data ){
print("data not found");
return;
}
if( checkData(data) == 0 ){
printf("Data is invaild.");
return;
}
/* ... go on ... */
finally, 你可以得到 正確的通過所有測試的input argument.
這樣的寫法 簡潔易讀 擴充性不佳 but...
在這個例子 本來例外狀況就不多 so 我建議用衛句 是最佳寫法
衛句的使用... 不代表一個工程師實作的能力
但是 他代表了一個工程師 對於自己的code 有沒有責任感
如果今天有個錯誤狀況出現 我是應該在我的code中攔截下來?
還是跟大部分工程師寫code一樣 把錯誤丟傳出去
看看哪個雖小工程師要去處理...
(就我的經驗 用衛句攔問題 和沒有用衛句debug時間10倍起跳)
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.166.119.168
推 loveme00835:很多人還是無法接受多個 return 的程式... 12/07 00:47
→ james732:那就用goto+單一return吧 XDDD (亂入) 12/07 00:48
推 ddavid:單以原問題的例子來說很簡單,把return都改成打開某個flag 12/07 00:58
→ ddavid:,然後最後全通過要執行的Code就只要看那個flag就好了 12/07 00:59
→ ddavid:這樣就不用一堆return或goto了。只是會損失一些時間在就算 12/07 01:00
→ ddavid:某些stage沒通過,後面所有stage都還是會被跑過...... 12/07 01:00
推 purpose:不能接受多 return 的原因...也許是會讓人聯想到遞迴... 12/07 01:41
推 StubbornLin:推這篇 我也會這樣寫 看條件在前面先return掉 12/07 12:17
→ awashharp:推文flag那招很常用 最近也在想flag要怎麼用會更方便XD 12/07 15:51
→ awashharp:原第一篇文有提到return不能夠使用的情況的說 還是感謝 12/07 15:52
推 VictorTom:在夾code跑到哪邊死掉, 但不能直接attach時(不管UM/KM), 12/07 21:14
→ VictorTom:需要加debug message時, 小弟我也覺得多重return很煩Orz 12/07 21:14