Re: [閒聊] 尋求比nest-if更優美的解決辦法
※ 引述《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
12/06 21:28, 1F
→
12/06 22:27, , 2F
12/06 22:27, 2F
→
12/07 06:11, , 3F
12/07 06:11, 3F
→
12/07 06:11, , 4F
12/07 06:11, 4F
→
12/07 06:29, , 5F
12/07 06:29, 5F
推
12/07 15:47, , 6F
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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 21 篇):