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

看板C_and_CPP作者時間13年前 (2010/12/08 15:12), 編輯推噓8(8010)
留言18則, 9人參與, 最新討論串17/21 (看更多)
※ 引述《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

12/08 15:14, , 1F
這...?! 囧
12/08 15:14, 1F

12/08 15:14, , 2F
很少見
12/08 15:14, 2F

12/08 15:15, , 3F
而且大概也無法 compile 過 orz
12/08 15:15, 3F

12/08 15:20, , 4F
我知道這不會過,大致的作法是這樣
12/08 15:20, 4F

12/08 15:31, , 5F
compile當然不會過,但他是把這當pseudo code來說明概念.
12/08 15:31, 5F

12/08 15:32, , 6F
他這概念也是我比較prefer的,也有這樣實作過.
12/08 15:32, 6F

12/08 16:14, , 7F
!?!?...這樣你最後還不是要用nested if來設你要switch的
12/08 16:14, 7F

12/08 16:15, , 8F
變數....
12/08 16:15, 8F

12/08 16:15, , 9F
如果你要switch某個result來印出不同字串 那個result還是
12/08 16:15, 9F

12/08 16:16, , 10F
要用上篇各篇提到的其中一種方法來得到吧..
12/08 16:16, 10F

12/08 16:27, , 11F
所以我會希望把難看的邏輯判斷放一邊
12/08 16:27, 11F

12/08 16:28, , 12F
凸顯要處理的動作
12/08 16:28, 12F

12/08 16:33, , 13F
你還是全寫出來吧
12/08 16:33, 13F

12/08 19:08, , 14F
單引號內的技巧是用巨集嗎?
12/08 19:08, 14F

12/08 20:49, , 15F
記得C#是支援switch用字串…但很顯然的C/C++是不能這樣做吧
12/08 20:49, 15F

12/08 20:53, , 16F
不過概念上,應該用enum可以做到同樣的事情才是。
12/08 20:53, 16F

12/09 00:32, , 17F
什麼樣的狀態或案例,會需要邏輯和動作分開呢?
12/09 00:32, 17F

12/09 00:33, , 18F
大概就像是將一個動作包裝成function 然後可以再利用吧?
12/09 00:33, 18F
文章代碼(AID): #1C_o_aFe (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 17 之 21 篇):
文章代碼(AID): #1C_o_aFe (C_and_CPP)