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.");
: 以上只是範例的程式碼,自己習慣function的return 0是正常的回應。
: 然後else中的printf只是一種代替,通常會去執行顯示錯誤的function,
: 而我的else中只會執行一個function,所以省去大括號排版了。
: 然後程式又會依照使用者要執行的代碼,然後出現很多組這種code…
: 雖然已經用了自己覺得很有規律的排版了,但還是會覺得縮排(indent)這麼深很不好…
: 所以就一直想要有個更優美的程式碼!
: 自己聽過的一些方案有:將這組code包在function中,然後用return去切斷每一階段…
: 但是把這些code再自己形成更多小塊的function總覺得很不直觀,
: 而且呼叫function還要再把一些所需的variable再透過parameter再丟進function中…
: 感覺會讓程式維護更沒有彈性的感覺。
http://codepad.org/XodMuEGj
其實剛剛推過了, 這應該是屬於這種方法?
其實對其他看程式碼的人而言, 你的世界奇觀還比較不直觀...
如果函式名稱取得好, 功能也切割合理, 對看程式碼的人幫助反而會很大
至於沒有彈性其實是一體兩面吧
對於後續維護而言, 知道這一段用了哪些沒用哪些資料反而有幫助
如果真的不想管這些那不如用全域宣告不也一樣...
: 好像還有人建議使用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);
我有時也會用 while 迴圈的方法
不過拘泥於排版要幾行其實沒意義, 少幾行程式也不會比較快
而且你是寫網路服務程式, 提升速度應該也不是你這邊可以有大貢獻的吧XD
: 會用這樣的程式碼總覺得是無法避免的!像是synchronization中的critical section
: 就比較不能自由自在的跳來跳去甚至直接return,
: 好像就得用傳統的if-else手法去解決的樣子…
: 想要請教版上大神是否有更優美的方式,來克服nest-if造成的超深indent,
: 或者是說有有更好的方式來解決這種處理錯誤的邏輯?
: 感謝大家把這篇中英文都很破爛的文章看完<(_ _)>
--
Les grandes et les meilleurs tone from "Zadok the Priest"
Eine grosse stattliche Veranstaltung by F. Handel
THE MAIN EVENT! These are the men
Sie sind die Besten
"Champions League" by Tony Britten THESE ARE THE CHAMPIONS!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.81.146
→
12/05 21:45, , 1F
12/05 21:45, 1F
→
12/05 21:46, , 2F
12/05 21:46, 2F
→
12/05 21:46, , 3F
12/05 21:46, 3F
→
12/05 21:47, , 4F
12/05 21:47, 4F
→
12/05 21:47, , 5F
12/05 21:47, 5F
推
12/06 01:39, , 6F
12/06 01:39, 6F
→
12/06 01:39, , 7F
12/06 01:39, 7F
→
12/06 08:04, , 8F
12/06 08:04, 8F
→
12/06 08:04, , 9F
12/06 08:04, 9F
→
12/06 08:05, , 10F
12/06 08:05, 10F
→
12/06 08:05, , 11F
12/06 08:05, 11F
推
12/06 11:20, , 12F
12/06 11:20, 12F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 21 篇):