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

看板C_and_CPP作者 (←這人是超級笨蛋)時間13年前 (2010/12/05 21:42), 編輯推噓2(2010)
留言12則, 3人參與, 最新討論串4/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."); : 以上只是範例的程式碼,自己習慣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
當初是想說接收到使用者指令後會依一個variable去處理
12/05 21:45, 1F

12/05 21:46, , 2F
各種的資料…想說再多幾個function然後parameter的數量
12/05 21:46, 2F

12/05 21:46, , 3F
沒有對齊就會覺得很煩躁XDDD(強迫症?) 所以不愛function
12/05 21:46, 3F

12/05 21:47, , 4F
的手法XD 不過if-else當成一個一個階段去執行從沒想過…
12/05 21:47, 4F

12/05 21:47, , 5F
只有在想說if之後要跳開的情況XD 總之感謝回復>"<
12/05 21:47, 5F

12/06 01:39, , 6F
你還可以把那些參數編碼用單一的一個變數統整,這樣的話你
12/06 01:39, 6F

12/06 01:39, , 7F
連switch case都能用喔XD
12/06 01:39, 7F

12/06 08:04, , 8F
如果可以用throw exception 會比較好
12/06 08:04, 8F

12/06 08:04, , 9F
或是把那一大串 if (ret!=0) { printf } 定義成macro
12/06 08:04, 9F

12/06 08:05, , 10F
每一行就只要寫 TEST_RESULT( checkData(data) );
12/06 08:05, 10F

12/06 08:05, , 11F
TEST_RESULT( modifyData(data) );
12/06 08:05, 11F

12/06 11:20, , 12F
樓上這招好酷!沒想過用macro這招去簡化流程XD
12/06 11:20, 12F
文章代碼(AID): #1C-vQuZ9 (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 21 篇):
文章代碼(AID): #1C-vQuZ9 (C_and_CPP)