Re: [問題] 程式中的空白處會影響程式本身嗎?

看板C_and_CPP作者 (朴髮箍)時間14年前 (2011/04/10 01:03), 編輯推噓13(1307)
留言20則, 12人參與, 最新討論串3/4 (看更多)
※ 引述《kyoiku (所有狗類的主人)》之銘言: : 例如程式中某段: : if(degree<30) : if(degree>=15) : cout<<"剛剛好"<<endl; : else : cout<<"好冷啊"<<endl; : else : cout<<"真熱"<<endl; : 如果寫成 : if(degree : <30)if(degree>= : 15) : cout<<"剛剛好"<<endl;else : cout<<"好冷啊" : <<endl;else cout<< : "真熱"<<endl; : 會不會對程式本身有影響? 會, 高階語言程式碼也是要寫給人看的. 同樣字數的程式, 能蘊含 較多訊息的程式比較受人歡迎, 不然你就寫組語算了! 以下有幾種 寫碼型式(劣 → 優): 一行解決型 if(degree<30) if(degree>=15) cout<<"剛剛好"<<endl; else cout<<"好冷啊"<<endl; else cout<<"真熱"<<endl; 評: 此類是最沒有價值的程式碼, 因為它只能被編譯成執行檔 , 而沒有人一眼就看得出它在幹嘛. 藝術型 if(degree<30) if(degree>=15) cout<<"剛剛好"<<endl; else cout<<"好冷啊"<<endl; else cout<<"真熱"<<endl; 評: 這也沒什麼價值, 雖然作者極盡所能想要美化它, 但是根 本用錯心思在錯的事物上, 你的兩段程式碼都屬於這類. 組語型 if(degree<30) // 30度(含)以上, 跳至(a) if(degree>=15) // 15度以下, 跳至(b) cout<<"剛剛好"<<endl; // else cout<<"好冷啊"<<endl; // (b) else cout<<"真熱"<<endl; // (a) 評: 比藝術型略佳, 看得出執行的先後順序, 但因為程式碼從 屬關係還是不明顯, 加上註解與程式碼分離, 所以較不易 和程式碼邏輯做個連貫. 層次分明型 if(degree<30) { if(degree>=15) cout<<"剛剛好"<<endl; else cout<<"好冷啊"<<endl; } else { cout<<"真熱"<<endl; } 評: 寫此類程式碼的人生怕讀者看不懂程式碼, 所以常用大括 號把一個 if 的兩面括起來, 而每種case的程式碼又多了 一級的縮排來標示出從屬關係, 所以追蹤程式碼跳躍上也 比較容易, 龜毛一點還可以每個分支都加大括號, 可避免 犯錯. 粒粒分明型 if( degree < 30 ) { if( degree >= 15 ) cout << "剛剛好" << endl; else cout << "好冷啊" << endl; } else { cout << "真熱" << endl; } 評: 不是關係非常密切的程式碼, 就不要連在一塊, 但是像陣 列或函式呼叫, 連在一起就是必須的(ex: a[i]、f(x)), 這樣個體間很好分別, 少幾個運算子(ex: == 寫成 =) 也 會很好抓出來. 我會傾向於把整個版面都填滿, 讓程式碼往右成長而不是單純的往 下寫, 這樣比較容易和組語型程式法做區別, 不過就需要將變數命 名等其他問題給考量進去. 現在初學就先思考一下以上程式碼對讀 者的影響吧! 簡言之就是: 好的程設師會讓 每一行程式碼皆 有意義; 不好的程設師只讓 很多行程式碼加起來才 有意義. -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115

04/10 09:11, , 1F
版面填滿?是說像 function call 就算字數再多,也要在一
04/10 09:11, 1F

04/10 09:11, , 2F
行內寫完這個 statement,不使用斷行的意思嗎?
04/10 09:11, 2F
當然引數超過一頁斷行也是必須. 加長的手法像是加上識別字: std::copy( vec.begin(), vec.end(), std::ostream_iterator<int>(cout) ); 雖然這樣不超過一頁, 但我還是習慣將第三個引數寫在下一行. 另外, 縮短也是有好處的: #define each(container) (container).begin(), (container).end() std::copy( each(vec), std::ostream_iterator<int>(cout) ); 還有就是多加幾層類別封裝, 為了讓它更像 pseudocode: marry.present.is_given_by( john ); 長不長不是絕對, 但在我的經驗裡, 通常往右長的程式比只往下長 的程式好讀很多.

04/10 09:14, , 3F
應該是善用一個畫面的可用資訊,而不是幾個字就換下一行?
04/10 09:14, 3F
沒錯, 訊息愈豐富愈有看得價值, 這並不是取決於註解的多寡, 最 高境界就是不需要註解來補充缺少的資訊

04/10 09:16, , 4F
瞭解。我的作法是看字數,接近 7,80 再斷
04/10 09:16, 4F

04/10 09:18, , 5F
p要等板主回答再瞭解啦 XD 我只是憶測
04/10 09:18, 5F

04/10 09:19, , 6F
您說得有道理呀
04/10 09:19, 6F

04/10 09:23, , 7F
第四和第五種感覺起來好像只有assignment的寫法有差?
04/10 09:23, 7F
在複雜的關係式也會比較合用, 優先權較高的不只用括號括起來, 個別再用運算子分離開一點, 比擠在一團來得好.

04/10 10:27, , 8F
其實 一行解決型 也沒不好, 可以自動略過無關緊要的地方
04/10 10:27, 8F

04/10 10:27, , 9F
再閱讀下去.
04/10 10:27, 9F
看了才知道那段程式重不重要阿~ :)

04/10 11:33, , 10F
推組語型XDD
04/10 11:33, 10F

04/10 14:05, , 11F
其實好不好讀的重點在有沒有表現出 purpose
04/10 14:05, 11F
是沒錯, 但是這是讀了之後才有的問題, 你對程式的第一印象取決 於它的結構, 覺得這個結構可讀, 才會繼續了解它的語意

04/10 14:47, , 12F
其實過長的運算式在某些情況編譯時會被忽略
04/10 14:47, 12F
※ 編輯: loveme00835 來自: 140.121.197.115 (04/10 14:56)

04/10 15:18, , 13F
其實過長的運算式在某些情況會讓編譯器當掉 (無誤
04/10 15:18, 13F

04/10 17:12, , 14F
我就是層次分明型的,因為我要寫給以後的自己看啊XDDD
04/10 17:12, 14F

04/10 17:13, , 15F
看錯了,我是粒粒分明型的,哈
04/10 17:13, 15F

04/10 17:41, , 16F
一開始寫程式就該養成好習慣了
04/10 17:41, 16F

04/10 18:45, , 17F
基本上大部份公司都會強迫你的coding style
04/10 18:45, 17F

04/10 18:45, , 18F
想亂用都不行XD
04/10 18:45, 18F

04/10 23:36, , 19F
推粒粒分明XDDDDD
04/10 23:36, 19F

04/11 01:49, , 20F
樓上帥哥
04/11 01:49, 20F
文章代碼(AID): #1DeG7dVD (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DeG7dVD (C_and_CPP)