看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)
uranusjr:http://codepad.org/XodMuEGj 一樣的作法, 我全寫了XD 12/05 21:35
※ 編輯: stupid0319 來自: 122.117.78.26 (12/05 21:36)
awashharp:感謝XD 看來大家還是傾向使用function包裝、return中斷 12/05 21:36
awashharp:不過在Critical Section中運行 還要再加個function好像 12/05 21:37
awashharp:會增加程式維護的負擔 尤其C/C++沒有nested function 12/05 21:38
stupid0319:你用else if就不用用含數跟return了 12/05 21:38
awashharp:感謝樓上XD 下一篇回文有用這個技巧XD 12/05 21:40