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

看板C_and_CPP作者 (喲)時間13年前 (2010/12/06 21:20), 編輯推噓1(1010)
留言11則, 4人參與, 最新討論串6/21 (看更多)
※ 引述《awashharp (AwA)》之銘言: : 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."); 像這個情況可以整理一下: int check = 0; check += (data != NULL)? 0: 16; check += (checkData(data) == 0)? 0: 8; check += (modifyData(data) == 0)? 0: 4; check += (fireDataChanged(data) == 0)? 0: 2; check += (saveDataIntoFile(data) == 0)? 0: 1; if (check >= 16) printf("No data.\n"); else if (check >= 8) printf("Data invalid.\n"); else if (check >= 4) printf("Data modification failed.\n"); else if (check >= 2) printf("Observer call failed.\n"); else if (check >= 1) printf("Data storing failed.\n"); else printf("Eventually work is done.\n"); 不過看起來也是寫太長,不怎麼好. 或者是先有一些函數像這樣: string null(string data) { if (data == "#nil" || data == NULL) { printf("No data.\n"); return "#nil"; } return data; } string check(string data) { if (data == "#nil") { return "#nil"; } string result = data; ... //checking if (result == "#bad") { printf("Data invalid.\n"); return "#nil"; } return result; } string modify(string data) { if (data == "#nil") { return "#nil"; } string result = data; ... //modifying if (result == "#bad") { printf("Data modification failed.\n"); return "#nil"; } return result; } string fireChangedEvent(string data) { if (data == "#nil") { return "#nil"; } string result = data; ... //fire event and check response or status if (result == "#bad") { printf("Data observer call failed.\n"); return "#nil"; } return result; } string saveFile(string data) { if (data == "#nil") { return "#nil"; } string result = data; ... //save and check saving status if (result == "#bad") { printf("Process failed when storing data.\n"); return "#nil"; } return result; } string complete(string data) { if (data != "#nil") { printf("Eventualy work is done.\n"); } return data; } 然後你要的程式就變成: string result = complete(saveFile(fireChangedEvent(modify(check(null(data)))))); 不過這樣有點癟腳之處,是通常是比較想要拿到部份處理完的的結果. 例如,經過modify卻無法fireChangedEvent的資料. 傳遞過程基本是傳遞信號,同樣一個簡單的傳回值,就沒辦法傳出片斷完成的資料了. 而如果包裝成struct,包含信號與資料,就可以傳回片斷完成資料了. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.160.114.215 ※ 編輯: yauhh 來自: 218.160.114.215 (12/06 21:29)

12/06 21:28, , 1F
最後面那個 string result = ....再包一個func似乎較佳
12/06 21:28, 1F

12/06 22:27, , 2F
語意不一樣了吧? checkData 掛掉後還繼續 modifyData
12/06 22:27, 2F

12/07 06:11, , 3F
語意一樣,任何一個程序只要失敗就一直傳出nil信號,後續遇到
12/07 06:11, 3F

12/07 06:11, , 4F
nil根本不處理.
12/07 06:11, 4F

12/07 06:29, , 5F
原來的語意也是check完會判斷要不要modify,如果不要就跳過.
12/07 06:29, 5F

12/07 15:47, , 6F
不過就變成每個function都要檢查data是否null或是符合
12/07 15:47, 6F

12/07 15:48, , 7F
正確資料形態…感覺會複雜化耶@口@
12/07 15:48, 7F

12/07 23:12, , 8F
沒有很複雜,這種作法的武功心法是函數語言
12/07 23:12, 8F

12/07 23:13, , 9F
對一個函數只思考傳回值有哪些情況,代表哪些意思.
12/07 23:13, 9F

12/07 23:15, , 10F
結果要簡化變成複雜化了
12/07 23:15, 10F

12/07 23:23, , 11F
哪裡複雜化了? 具體的指出來吧 (看不懂並不表示複雜喔)
12/07 23:23, 11F
文章代碼(AID): #1C_ECk7k (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 21 篇):
文章代碼(AID): #1C_ECk7k (C_and_CPP)