看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)
tropical72:最後面那個 string result = ....再包一個func似乎較佳 12/06 21:28
akasan:語意不一樣了吧? checkData 掛掉後還繼續 modifyData 12/06 22:27
yauhh:語意一樣,任何一個程序只要失敗就一直傳出nil信號,後續遇到 12/07 06:11
yauhh:nil根本不處理. 12/07 06:11
yauhh:原來的語意也是check完會判斷要不要modify,如果不要就跳過. 12/07 06:29
awashharp:不過就變成每個function都要檢查data是否null或是符合 12/07 15:47
awashharp:正確資料形態…感覺會複雜化耶@口@ 12/07 15:48
yauhh:沒有很複雜,這種作法的武功心法是函數語言 12/07 23:12
yauhh:對一個函數只思考傳回值有哪些情況,代表哪些意思. 12/07 23:13
akasan:結果要簡化變成複雜化了 12/07 23:15
yauhh:哪裡複雜化了? 具體的指出來吧 (看不懂並不表示複雜喔) 12/07 23:23