Re: [閒聊] 尋求比nest-if更優美的解決辦法

看板C_and_CPP作者 (software everywhere)時間13年前 (2010/12/07 00:45), 編輯推噓5(507)
留言12則, 7人參與, 最新討論串8/21 (看更多)
※ 引述《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

12/07 00:47, , 1F
很多人還是無法接受多個 return 的程式...
12/07 00:47, 1F

12/07 00:48, , 2F
那就用goto+單一return吧 XDDD (亂入)
12/07 00:48, 2F

12/07 00:58, , 3F
單以原問題的例子來說很簡單,把return都改成打開某個flag
12/07 00:58, 3F

12/07 00:59, , 4F
,然後最後全通過要執行的Code就只要看那個flag就好了
12/07 00:59, 4F

12/07 01:00, , 5F
這樣就不用一堆return或goto了。只是會損失一些時間在就算
12/07 01:00, 5F

12/07 01:00, , 6F
某些stage沒通過,後面所有stage都還是會被跑過......
12/07 01:00, 6F

12/07 01:41, , 7F
不能接受多 return 的原因...也許是會讓人聯想到遞迴...
12/07 01:41, 7F

12/07 12:17, , 8F
推這篇 我也會這樣寫 看條件在前面先return掉
12/07 12:17, 8F

12/07 15:51, , 9F
推文flag那招很常用 最近也在想flag要怎麼用會更方便XD
12/07 15:51, 9F

12/07 15:52, , 10F
原第一篇文有提到return不能夠使用的情況的說 還是感謝
12/07 15:52, 10F

12/07 21:14, , 11F
在夾code跑到哪邊死掉, 但不能直接attach時(不管UM/KM),
12/07 21:14, 11F

12/07 21:14, , 12F
需要加debug message時, 小弟我也覺得多重return很煩Orz
12/07 21:14, 12F
文章代碼(AID): #1C_HCtOr (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 8 之 21 篇):
文章代碼(AID): #1C_HCtOr (C_and_CPP)