Re: [閒聊] 尋求比nest-if更優美的解決辦法
※ 引述《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
01/06 02:24, 1F
→
01/06 17:04, , 2F
01/06 17:04, 2F
→
01/07 00:10, , 3F
01/07 00:10, 3F
→
01/07 05:55, , 4F
01/07 05:55, 4F
討論串 (同標題文章)