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

看板C_and_CPP作者 (AwA)時間13年前 (2010/12/05 21:14), 編輯推噓5(508)
留言13則, 8人參與, 最新討論串1/21 (看更多)
最近在寫一些網路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."); 以上只是範例的程式碼,自己習慣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: 140.113.246.235

12/05 21:17, , 1F
標題看著看著居然想到O'Reilly的《Beautiful Code》了XD
12/05 21:17, 1F

12/06 00:48, , 2F

12/06 01:07, , 3F
用func ptr包進一個array, looping and check ret value
12/06 01:07, 3F

12/06 01:34, , 4F
樓上強者 0.0
12/06 01:34, 4F

12/06 01:44, , 5F
FSM?
12/06 01:44, 5F

12/06 11:17, , 6F
看不懂三樓再說什麼@口@ 神秘咒語XD? 能再進一步解釋嗎?
12/06 11:17, 6F

12/06 11:27, , 7F
3樓的方法的複雜化吧
12/06 11:27, 7F

12/06 15:14, , 8F
忽然看懂三樓方法了XD 存下function ptr進array 然後
12/06 15:14, 8F

12/06 15:14, , 9F
一個一個去執行 檢查回應值並做反應XD 不過真的是複雜化
12/06 15:14, 9F

12/06 20:49, , 10F
function pointer不複雜XD 如果要多幾個條件也只不過多幾個
12/06 20:49, 10F

12/06 20:50, , 11F
陣列
12/06 20:50, 11F

12/06 21:21, , 12F
沒錯,三樓說的是非常讚的方法
12/06 21:21, 12F

01/07 22:30, , 13F
其實我是在寫C程式阿QAQ 結果大家都圍繞著C++解法XDD
01/07 22:30, 13F
文章代碼(AID): #1C-v0gGS (C_and_CPP)
討論串 (同標題文章)
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 1 之 21 篇):
文章代碼(AID): #1C-v0gGS (C_and_CPP)