作者tcling ()
看板C_and_CPP
標題Re: [閒聊] 尋求比nest-if更優美的解決辦法
時間Wed Dec 8 15:12:33 2010
※ 引述《yauhh (喲)》之銘言:
: ※ 引述《wowtiger (小虎)》之銘言:
: : 兩三年前會用這個怪格式寫 XD
: : (data == NULL) ? printf("Data not found."):
: : (checkData(data) != 0) ? printf("Data is invaild."):
: : (modifyData(data) != 0) ? printf("Data modification failed."):
: : (fireDataChanged(data) != 0) ? printf("Observer call failed."):
: : (saveDataIntoFile(data) != 0) ? printf("Data storage failed."):
: : /* success */ ? printf("Finally succeed...");
: : 不過後來發現很多人看不懂就沒用了
: : code 還是簡單明瞭最好
: 當然善用shortcut-circuit evaluation寫邏輯句子很容易:
: (data == NULL) && printf("Data not found.")
: || (checkData(data) != 0) && printf("Data is invaild.")
: || (modifyData(data) != 0) && printf("Data modification failed.")
: || (fireDataChanged(data) != 0) && printf("Observer call failed.")
: || (saveDataIntoFile(data) != 0) && printf("Data storage failed.")
: || printf("Finally succeed...");
: 邏輯運算一般是 && 優先權高於 ||.
: 使用 ? : 還可以把stage埋進去,或者把部份處理完的資料傳回來.
: 至於看起來是不是簡單明瞭,邏輯句基本上是最簡單明瞭的,
: 看不懂這種句子的人是自己基礎學科沒有學好.
原本原PO希望nest-if能夠不要愈寫愈深,尋求更優美的作法,
但y版友寫深shortcut-circuit的方法,我直覺也是不太優美,
我直覺認為優美的程式應該是好維護好管理,
在這裡我會希望邏輯判斷和動作應該分開,
前面已經很多高手提供很棒的方法
肉腳的我也提供一個我直覺會使用case-switch的方法
//動作放一邊
switch(condition())
{
case 'data':
printf("Data not found.");
break;
case 'checkData(data)':
printf("Data is invaild.");
break;
case 'modifyData(data)':
printf("Data modification failed.");
break;
case 'fireDataChanged(data)':
printf("Observer call failed.");
break;
case 'saveDataIntoFile(data)':
printf("Data storage failed.");
break;
}
//邏輯放一邊
int condition()
{
.
.
.
}
這樣感覺就算半年後再打開這個程式,也會很快進入狀況。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.62.131.148
推 ledia:這...?! 囧 12/08 15:14
推 purpose:很少見 12/08 15:14
→ ledia:而且大概也無法 compile 過 orz 12/08 15:15
→ tcling:我知道這不會過,大致的作法是這樣 12/08 15:20
→ tomnelson:compile當然不會過,但他是把這當pseudo code來說明概念. 12/08 15:31
→ tomnelson:他這概念也是我比較prefer的,也有這樣實作過. 12/08 15:32
推 holymars:!?!?...這樣你最後還不是要用nested if來設你要switch的 12/08 16:14
→ holymars:變數.... 12/08 16:15
→ holymars:如果你要switch某個result來印出不同字串 那個result還是 12/08 16:15
→ holymars:要用上篇各篇提到的其中一種方法來得到吧.. 12/08 16:16
→ tcling:所以我會希望把難看的邏輯判斷放一邊 12/08 16:27
→ tcling:凸顯要處理的動作 12/08 16:28
推 ledia:你還是全寫出來吧 12/08 16:33
→ bleed1979:單引號內的技巧是用巨集嗎? 12/08 19:08
推 aecho:記得C#是支援switch用字串…但很顯然的C/C++是不能這樣做吧 12/08 20:49
推 aecho:不過概念上,應該用enum可以做到同樣的事情才是。 12/08 20:53
推 sandr1983:什麼樣的狀態或案例,會需要邏輯和動作分開呢? 12/09 00:32
推 awashharp:大概就像是將一個動作包裝成function 然後可以再利用吧? 12/09 00:33