作者yauhh (喲)
看板C_and_CPP
標題Re: [閒聊] 尋求比nest-if更優美的解決辦法
時間Mon Dec 6 21:20:42 2010
※ 引述《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