2011年4月21日 星期四

程式中的空白處會影響程式本身嗎

作者: loveme00835 (朴髮箍) 看板: C_and_CPP
標題: Re: [問題] 程式中的空白處會影響程式本身嗎?
時間: Sun Apr 10 09:03:31 2011

※ 引述《kyoiku (所有狗類的主人)》之銘言:
: 例如程式中某段:
: if(degree<30)
:    if(degree>=15)
:       cout<<"剛剛好"<
: else
:       cout<<"好冷啊"<
: else
:       cout<<"真熱"<
: 如果寫成
: if(degree
:           <30)if(degree>=
: 15)
:       cout<<"剛剛好"<
: cout<<"好冷啊"
: <<<
:           "真熱"<
: 會不會對程式本身有影響?
會, 高階語言程式碼也是要寫給人看的. 同樣字數的程式, 能蘊含
較多訊息的程式比較受人歡迎, 不然你就寫組語算了! 以下有幾種
寫碼型式(劣 → 優):


一行解決型
    if(degree<30) if(degree>=15) cout<<"剛剛好"<
    else cout<<"好冷啊"<<<"真熱"<

    評: 此類是最沒有價值的程式碼, 因為它只能被編譯成執行檔
        , 而沒有人一眼就看得出它在幹嘛.

藝術型
    if(degree<30) if(degree>=15)
        cout<<"剛剛好"<
            else cout<<"好冷啊"<
                 else cout<<"真熱"<

    評: 這也沒什麼價值, 雖然作者極盡所能想要美化它, 但是根
        本用錯心思在錯的事物上, 你的兩段程式碼都屬於這類.

組語型
    if(degree<30)                // 30度(含)以上, 跳至(a)
    if(degree>=15)               // 15度以下, 跳至(b)
    cout<<"剛剛好"<
    else cout<<"好冷啊"<
    else cout<<"真熱"<

    評: 比藝術型略佳, 看得出執行的先後順序, 但因為程式碼從
        屬關係還是不明顯, 加上註解與程式碼分離, 所以較不易
        和程式碼邏輯做個連貫.

層次分明型
    if(degree<30)               
    {
        if(degree>=15)              
            cout<<"剛剛好"<
        else
            cout<<"好冷啊"<
    }
    else
    {
        cout<<"真熱"<
    }

    評: 寫此類程式碼的人生怕讀者看不懂程式碼, 所以常用大括
        號把一個 if 的兩面括起來, 而每種case的程式碼又多了
        一級的縮排來標示出從屬關係, 所以追蹤程式碼跳躍上也
        比較容易, 龜毛一點還可以每個分支都加大括號, 可避免
        犯錯.

粒粒分明型
    if( degree < 30 )
    {
        if( degree >= 15 )
            cout << "剛剛好" << endl;
        else
            cout << "好冷啊" << endl;
    }
    else
    {
        cout << "真熱" << endl;
    }

    評: 不是關係非常密切的程式碼, 就不要連在一塊, 但是像陣
        列或函式呼叫, 連在一起就是必須的(ex: a[i]、f(x)),
        這樣個體間很好分別, 少幾個運算子(ex: == 寫成 =) 也
        會很好抓出來.

我會傾向於把整個版面都填滿, 讓程式碼往右成長而不是單純的往
下寫, 這樣比較容易和組語型程式法做區別, 不過就需要將變數命
名等其他問題給考量進去. 現在初學就先思考一下以上程式碼對讀
者的影響吧!

簡言之就是:
    好的程設師會讓 每一行程式碼皆 有意義;
    不好的程設師只讓 很多行程式碼加起來才 有意義.

--
[34m [37;45m   [35m   [37m   [1;30m  [;35;45m [37m [35m?[1;30mc [;30;45m▅ [1m?[;35;45mc [37m     [30m▁ [37m       ● [37m     [35m     [37m [34;41m◣     [;34;41m  [36m朴 [37m [5m☆ [;37;41m [1;32m素 [;37;41m [1;5m★ [;37;41m [1;33m妍 [37m  [;34;41m    ◢
[34m [37;45m  [31m◢ [41m    [45m◣ [37m [35m [30m◢ [33;40m▂▂ [30;45m◣ [37m  [35m?[30m?[33;40m▂ [1;30m※ [;30;45m?[35m?[37m  [35m?[30m?[33;40m▄▂ [30;45m◣ [37m [35m     [34;44m  [40m T.T.L Listen 2           [34m [44m 
[34m [37;45m [36m [1;35;41m [;33;43m [1;37;40m?[;33;43m? [1;37;40m?[;33;43m?[1;30;41m [;37;45m  [35;40m [43m [1;37;40m?[;33;43m? [1;37;40m?[;33;43m?[m [45m [35;40m▉ [1;37;43m [40m?[;33;43m? [1;37;40m?[;33;43m?[30;45m▏ [35;43m?[40mp [37;43m [1;40m?[;33;43m?[37m [1;40m?[;33;43m?[30;40m?[45m?[35m     [34;44m         [34m [1;30mhttp://ppt.cc/jIUk [37m [;34;44m 
[34m [37;45m  [1;30;41m [;33;41m◥ [1;31;43mˇ [;31;43m◢ [41m [1;30;45m [;35;45m?[40md?[45m?[1;35;43mˇ [;33;45m?[40m?[35m?[45md  ◥ [1;35;43mˇ [;33;45m◤ [37m  [35m  ◥ [35;43mˇ [33;45m◤ [30;40m?[35m?[45m     [34;44m  [40m 說什麼結束 [;31;40m              [1m  [34;44m 
[34m [35;45m ?[41md▃ [1;34;43m▇ [;35;41m▃?[45md [36m [35m [1m◢ [47m▇ [45m◣ [;37;45m [35m  [37m  ▋ [30;47m▎ [37;45m   [35m  [43m▋ [1;33;46m¥ [;33;45m▎ [35m     ◢ [34;44m         [34m [1;30mhttp://ppt.cc/zQtB [34;44m 
[34m [37;45m  [30m   [;33;45m▼ [37m    [1;30m   [;33;45m ▼ [37m    [35m  [37m  [30m▼ [37m   [30m [35m  [30m  ▼  [1mψ髮箍 [;35;45m [34;41m◤ [31m                         [;31;41m  [44m◣

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
推 purpose:版面填滿?是說像 function call 就算字數再多,也要在一   04/10 09:11
→ purpose:行內寫完這個 statement,不使用斷行的意思嗎?            04/10 09:11
當然引數超過一頁斷行也是必須.
加長的手法像是加上識別字:

    std::copy( vec.begin(), vec.end(), std::ostream_iterator(cout) );

雖然這樣不超過一頁, 但我還是習慣將第三個引數寫在下一行.
另外, 縮短也是有好處的:

    #define each(container) (container).begin(), (container).end()
    std::copy( each(vec), std::ostream_iterator(cout) );

還有就是多加幾層類別封裝, 為了讓它更像 pseudocode:

    marry.present.is_given_by( john );

長不長不是絕對, 但在我的經驗裡, 通常往右長的程式比只往下長
的程式好讀很多.
→ ericinttu:應該是善用一個畫面的可用資訊,而不是幾個字就換下一行?  04/10 09:14
沒錯, 訊息愈豐富愈有看得價值, 這並不是取決於註解的多寡, 最
高境界就是不需要註解來補充缺少的資訊
推 purpose:瞭解。我的作法是看字數,接近 7,80 再斷                  04/10 09:16
推 ericinttu:p要等板主回答再瞭解啦 XD 我只是憶測                   04/10 09:18
推 purpose:您說得有道理呀                                          04/10 09:19
推 RouterHsieh:第四和第五種感覺起來好像只有assignment的寫法有差?  04/10 09:23
在複雜的關係式也會比較合用, 優先權較高的不只用括號括起來,
個別再用運算子分離開一點, 比擠在一團來得好.
推 ericinttu:其實 一行解決型 也沒不好, 可以自動略過無關緊要的地方  04/10 10:27
→ ericinttu:再閱讀下去.                                           04/10 10:27
看了才知道那段程式重不重要阿~ :)
推 j094097:推組語型XDD                                             04/10 11:33
推 Ebergies:其實好不好讀的重點在有沒有表現出 purpose               04/10 14:05
是沒錯, 但是這是讀了之後才有的問題, 你對程式的第一印象取決
於它的結構, 覺得這個結構可讀, 才會繼續了解它的語意
→ firejox:其實過長的運算式在某些情況編譯時會被忽略                04/10 14:47
※ 編輯: loveme00835     來自: 140.121.197.115      (04/10 14:56)
推 littleshan:其實過長的運算式在某些情況會讓編譯器當掉 (無誤       04/10 15:18

沒有留言:

張貼留言

您好.本資料庫並非第一手資料.如果你有對文章作者的詢問,意見與需求,請自行找尋文章作者並提供意見,謝謝.