Re: [閒聊] 尋求比nest-if更優美的解決辦法
※ 引述《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.");
我會這樣寫
if(data == NULL) {
printf("Data not found.");
return;
}
else if(checkData(data) != 0) { //或者不加else
printf("Data is invaild.");
return;
}
else if(modifyData(data) != 0) {
printf("Data modification failed.");
return;
}
.
.
.
else printf("Finally succeed...");
參考看看
: 以上只是範例的程式碼,自己習慣function的return 0是正常的回應。
: 然後else中的printf只是一種代替,通常會去執行顯示錯誤的function,
: 而我的else中只會執行一個function,所以省去大括號排版了。
: 然後程式又會依照使用者要執行的代碼,然後出現很多組這種code…
: 雖然已經用了自己覺得很有規律的排版了,但還是會覺得縮排(indent)這麼深很不好…
: 所以就一直想要有個更優美的程式碼!
: 自己聽過的一些方案有:將這組code包在function中,然後用return去切斷每一階段…
: 但是把這些code再自己形成更多小塊的function總覺得很不直觀,
: 而且呼叫function還要再把一些所需的variable再透過parameter再丟進function中…
: 感覺會讓程式維護更沒有彈性的感覺。
: 好像還有人建議使用goto來做失敗時的跳躍,
: 但自己寫的程式碼中,時常else中只會作單獨一件事情,
: 若在加上goto的程式碼,就勢必要加上大括號,要是在要求要排版好看,
: 原本一行的東西就變四行了…像是:
: if(checkData(data) != 0) printf("Data is invalid.");
: ↓
: if(checkData(data) != 0) {
: printf("Data is invalid.");
: goto end;
: }
: 再來有想到do...while的辦法,就是用類似function的return手法,但改成break,
: 不過感覺也有goto的排版問題:
: do {
: if(checkData(data) != 0) { printf("Data is invalid."); break; }
: if(modifyData(data) != 0) { printf("Data modification failed."); break; }
: if(fireDataChanged(data) == 0) { printf("Observer call failed."); break; }
: ...(略)
: } while(0);
: 會用這樣的程式碼總覺得是無法避免的!像是synchronization中的critical section
: 就比較不能自由自在的跳來跳去甚至直接return,
: 好像就得用傳統的if-else手法去解決的樣子…
: 想要請教版上大神是否有更優美的方式,來克服nest-if造成的超深indent,
: 或者是說有有更好的方式來解決這種處理錯誤的邏輯?
: 感謝大家把這篇中英文都很破爛的文章看完<(_ _)>
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.117.78.26
※ 編輯: stupid0319 來自: 122.117.78.26 (12/05 21:35)
→
12/05 21:35, , 1F
12/05 21:35, 1F
※ 編輯: stupid0319 來自: 122.117.78.26 (12/05 21:36)
推
12/05 21:36, , 2F
12/05 21:36, 2F
→
12/05 21:37, , 3F
12/05 21:37, 3F
→
12/05 21:38, , 4F
12/05 21:38, 4F
→
12/05 21:38, , 5F
12/05 21:38, 5F
→
12/05 21:40, , 6F
12/05 21:40, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 21 篇):