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

看板C_and_CPP作者 (tedium of chores)時間14年前 (2011/01/05 14:37), 編輯推噓0(004)
留言4則, 4人參與, 最新討論串19/21 (看更多)
※ 引述《legnaleurc (CA)》之銘言: : ※ 引述《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."); : 如果是 C++ 的話 ... 我通常是用 exception 說 : if( data == NULL ) { : // error return : } : try { : checkData( data ); : modifyData( data ); : fireDataChanged( data ); : saveDataIntoFile( data ); : } catch( DataInvalidError & e ) { : // do some roll back thing : } catch( std::exception & e ) { : // what ever error : } : // here should be fine : 呃, 本質上也是利用類似 setjump 的效果啦 : 純 C 的話 ... 我應該也是會用連串的 if-else : 雖然說彈性有比較差, 但是不會想要再增加 : function pointer array 或是 State Pattern 的複雜度 因為有點想要了解exception 對於這樣的狀況 要怎麼設計這個catch 和DataInvalidError exception 呢? 如果說每個function ( checkData, modifyData, fireDataChanged, saveDataIntoFile) 如果throw 出來的都是DataInvalidError 這個type 那勢必catch 還是要用一連串的if 去判斷e 這個傳近來的exception 的內容是哪一個function throw出來的 (或是用switch 的語法) 或是說DataInvalidError 這邊是用繼承的技巧(這邊我就不太熟了) 讓catch 能夠分辨出來 是哪個type 而得知是哪個function丟出來的 是這樣嗎? 還是說我上面說的其實都不對 還有其他的方式 除了用catch 的argument type 做辨別? 而目前對於這個try catch 的方式 這作法的亮點似乎是把判斷特徵冗長的nested-if 和實作分開 這作法我還蠻喜歡的 但細節上總覺得有點不對勁 如果像上面我描述的那樣 那似乎是把原本if 去做一些特徵判斷 改成 在catch 內用if 去做結果的辨別 從code 的擺設上面看起來 似乎是把nested-if 搬進catch 內做 是這樣嗎@@? 因為覺得catch 內多這麼多if else 感覺有點毛毛的、很詭異的感覺 是不是還有其他更美麗的作法? 感恩m(_._)m -- CHUNG TI SU LI !!! PigC jo way !!! TSON GO GER !!!!! 3 ming, zhou 1, 5 don, so zhoung. 1 gian, ming go, 1 gin, da tong. g 2 dor 4 way ming chan fon. su ya fay say zhou 1 Strong. 4 chin 4 yung, B sin B zhoung, 1 sin 1 der, goung tser 4 zhong ! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.169.209

01/06 02:24, , 1F
全體肅立 豬C就位 唱國歌 //我竟然看得懂@@a
01/06 02:24, 1F

01/06 17:04, , 2F
簽名檔 XDDDDDDDDD
01/06 17:04, 2F

01/07 00:10, , 3F
推簽名檔XD
01/07 00:10, 3F

01/07 05:55, , 4F
豬頭C是以前美好的回憶阿 (遠望)
01/07 05:55, 4F
文章代碼(AID): #1D988hNE (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 19 之 21 篇):
文章代碼(AID): #1D988hNE (C_and_CPP)