• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            第一桶 從C到C++ 第五碗 陳老C談編碼規(guī)范 潘小P學(xué)江湖黑話

                 “今天那個(gè)新加坡的叫獸講的P2P還挺有意思的,”從報(bào)告廳出來(lái),小P和老C走回教研室,小P一副很有心得的樣子。

                 “是嗎?我就一直和他的英語(yǔ)做斗爭(zhēng)了,基本上沒(méi)有聽(tīng)懂……都是華人,講漢語(yǔ)好了……”

                 “哈哈,講漢語(yǔ)怎么能體現(xiàn)國(guó)際水平,說(shuō)不定人家還不會(huì)漢語(yǔ)呢。”

                 “就算講英語(yǔ),口音也不要那么重啊,我怎么聽(tīng)出一點(diǎn)唐山音呢?”老C有些不忿,“老美的我還是可以聽(tīng)懂的,英國(guó)人的可能差一些,不過(guò)也可以理解……”

                 “嘻嘻,你還沒(méi)有聽(tīng)過(guò)印度人的英語(yǔ)呢……”

                 兩個(gè)人一邊走一邊說(shuō)笑,進(jìn)了教研室。

                 “嘿嘿。”老C突然壞笑起來(lái)。

                 小P打了一個(gè)冷顫:“怎么了,這么吝的?”

                 “還記得周一我們的約定嗎?”老C開(kāi)始使壞,“我和你打賭,賭注是今天的晚飯。我賭周一的代碼,你無(wú)法順利的解釋清楚……”

                 “切!”小P險(xiǎn)些忘了這回事情,“剛好我中午吃得不多,你就準(zhǔn)備好錢(qián)吧!”

                 “好,其實(shí)我早就想請(qǐng)你吃飯了!”老C拍拍口袋。

                 小P打開(kāi)電腦,打開(kāi)eclipse,找了一會(huì)兒,翻出那個(gè)a.c文件。“看,其實(shí)就是一個(gè)循環(huán)隊(duì)列,很簡(jiǎn)單……”小P用鼠標(biāo)在上面指指點(diǎn)點(diǎn)。


            #include <stdio.h>
             
            void main()
            {
            int a[20];
             int  b;
             int m;
             int k;
              int   N=20;
                for(m=0;m<20;++m){
                 a[m]=1;}

                m= 0;
                b =1;
                while(N>1)
                {  if(a[m]!=0)
                    {
                        if (b==7){
                         a[m] = 0;
                          --N;
                           if (N==1)
                            {break;
                            }
                            b=1;
                        }
                      else{
                       ++b;
                        }
                    }
                    ++m;
                    m%=20;
                }

                for(k=0;k<20;++k){
                 if (a[k]==1)
                 {break;}
                   }
                ++k;
                printf("%d\n", k);
            }


                 “哦?是啊。”老C把椅子轉(zhuǎn)過(guò)來(lái),開(kāi)始聽(tīng)小P介紹自己的代碼,“我怎么忘了是數(shù)到幾的倒霉孩子被踢出隊(duì)伍了?”
                 “?自己出的題目都記不住?”小P開(kāi)始翻看自己的代碼,“應(yīng)當(dāng)是……嗯……也許……是,是數(shù)到7的被踢出!”
                 老C一臉壞笑:“您這個(gè)反映也太慢了吧?”然后他隨便用筆點(diǎn)了一下屏幕,“請(qǐng)問(wèn)這里為什么是 b = 1啊?”
                 “嗯,我看看……”小P一邊看一邊嘴里默念這什么,“先是初始化……然后,嗯,這個(gè)1代表在隊(duì)列中……如果隊(duì)里還有多于一個(gè)人……”這個(gè)時(shí)候小P恨不得運(yùn)行一下gdb來(lái)單步跟蹤一下自己的代碼,“嗯,是這樣的,哦,不對(duì)不對(duì)……”掙扎了一番后,小P很神氣的說(shuō),“這里表示,如果一個(gè)小朋友被踢出隊(duì)列,那么下一個(gè)小朋友應(yīng)當(dāng)數(shù)1!”
                 “呵呵,”老C笑道,“你的記憶力比我想象的好很多啊……”
                 “那是!”小P很是得意。
                 “那么我們來(lái)做個(gè)假設(shè),”老C開(kāi)始使壞,“如果現(xiàn)在幼兒園有25個(gè)孩子,結(jié)果是什么?”
                 “我看看,”小P開(kāi)始改代碼,“應(yīng)當(dāng)是……”
                 “如果是5個(gè),30個(gè)或50個(gè)孩子呢?答案分別是多少?”老C不依不饒。
                 “哦,哦……”小P手忙腳亂的改代碼,一次還因?yàn)橥烁膄or循環(huán)里面的結(jié)束條件,導(dǎo)致數(shù)組越界造成內(nèi)存錯(cuò)誤,查找了一番。
                 看到小P滿頭大汗的調(diào)試代碼,老C有些不忍心了,“算了,算了,我就不和你爭(zhēng)了,晚飯我請(qǐng)了!”
                 “哦?”小P高興的抬頭,“還是上次那一家?”
                 “呵呵,飯雖然我請(qǐng)你了,但是該說(shuō)的話我還是要說(shuō)的。”老C點(diǎn)點(diǎn)頭,“你現(xiàn)在憑良心講,這段代碼寫(xiě)得如何?”
                 “嗯……”沒(méi)有了晚飯的壓力,小P開(kāi)始認(rèn)真考慮這個(gè)問(wèn)題,“感覺(jué)確實(shí)不是很好,隔了一段時(shí)間看有種陌生的感覺(jué)……而且有點(diǎn)難調(diào)試,一時(shí)不知道應(yīng)當(dāng)怎么下手……”
                 “呵呵,你很誠(chéng)實(shí)啊,”老C表?yè)P(yáng)小P,“這是做研發(fā)的態(tài)度!”他沖小P伸出大拇指,“很多人不愿意承認(rèn)自己的問(wèn)題呢,但是只有認(rèn)識(shí)到自己的問(wèn)題才可以進(jìn)步啊,因此你不要害怕被別人踩,雖然有些話比較難聽(tīng),但是只要道理是對(duì)的,你可以自動(dòng)過(guò)濾掉感情傾向性的因素,認(rèn)真體會(huì)每個(gè)批評(píng)的內(nèi)涵吧。”
                 “嘿嘿,”小P頓時(shí)有了一種“生我者父母,知我者老C”的感覺(jué)。
                 看到小青年被自己揉捏的差不多了,老C說(shuō):“我們把這段代碼打印下來(lái),在紙上比較好圈圈點(diǎn)點(diǎn)……”
                 “好咧。”小P把代碼打印出來(lái),放到兩個(gè)人面前。
                 “我們先不說(shuō)代碼,先說(shuō)說(shuō)你起的文件名稱(chēng)吧,a.c,這個(gè)名稱(chēng)……很……中性……不帶任何感情色彩,當(dāng)然也不帶任何有用的信息……你剛才還是找了一番才找到的吧。”
                 “沒(méi)有,我工程里面的文件并不多……”
                 “如果工程很多呢?我個(gè)人覺(jué)得我們是不是起一個(gè)帶有強(qiáng)烈感情色彩的文件名更好呢?就算是main.c也比a.c強(qiáng)一些,起碼你還知道自己的main()函數(shù)在哪個(gè)文件里面,而不用麻煩的使用IDE的search功能!”
                 “呵呵,我承認(rèn)你說(shuō)的有道理。”
                 “總的來(lái)說(shuō),這篇代碼中存在很多的經(jīng)典問(wèn)題,但是我們目前只說(shuō)代碼的樣子而先不談代碼的內(nèi)容。”老C在紙上寫(xiě)下幾行大字。

            1. 前后統(tǒng)一
            2. 縮進(jìn)風(fēng)格

            3. 命名規(guī)范


                  “我們先來(lái)說(shuō)說(shuō)規(guī)范的事情,”老C說(shuō)道,“希望你可以理解到規(guī)范的重要性。”他強(qiáng)調(diào),“我們寫(xiě)代碼是寫(xiě)給誰(shuí)看的?是寫(xiě)給編譯器看的嗎?不,是寫(xiě)給人看的。我們是社會(huì)人,有別于自然人,需要遵守一定的規(guī)則,這樣別人才可以預(yù)期你的行為,從而可以減少很多溝通的成本。”

                 “槑……”

                 “就比如交通吧,大家都靠右走,這樣才可以順利,如果哪個(gè)家伙在左邊走,一定會(huì)引起不必要的麻煩甚至事故,這個(gè)是生活中規(guī)范的重要性,編碼也是一樣的。在編程行業(yè)內(nèi),有很多約定俗成的規(guī)范,你最好順著它們來(lái),因?yàn)樗鼈兌际墙?jīng)過(guò)檢驗(yàn)的,行之有效的,可以避免很多低級(jí)錯(cuò)誤的行為守則,這些守則我倒是知道一些,我會(huì)在以后和你慢慢討論這些守則。”老C從他的桌子上拿過(guò)一杯水喝了一口,“下來(lái)我要和你說(shuō)說(shuō)排版的問(wèn)題,嚴(yán)格說(shuō)來(lái),所謂排版或者縮進(jìn),沒(méi)有規(guī)則,但一定要前后統(tǒng)一。”老C開(kāi)始在紙上劃拉起來(lái),“你可以在一行開(kāi)始縮進(jìn)任何的空格個(gè)數(shù)或者使用tab健,但是,從你第一行代碼到作后一行代碼,一定要統(tǒng)一!”

                 “為什么?”小P不解的問(wèn)。

                 “因?yàn)槿丝倳?huì)有思維慣性,我們總是喜歡在熟悉的環(huán)境內(nèi)生活或是工作,看代碼也一樣……如果你前后的風(fēng)格統(tǒng)一,那么看代碼的人心理壓力會(huì)小很多,而且也更容易讓人的注意力從格式上轉(zhuǎn)移到代碼內(nèi)容本身,而不是總在想,該死,這里怎么突然多出一個(gè)空格!總之我們的心理作用,在進(jìn)行注意力高度集中的智力活動(dòng)時(shí),總是喜歡簡(jiǎn)潔、整齊的環(huán)境,這樣可以減少環(huán)境突然改變對(duì)注意力的影響。”

                 “哦,好像的確是這樣,我在考試的時(shí)候,的確卷子越整齊,出錯(cuò)的概率就越小……”

                 “嗯,雖然理論上說(shuō)只要保證你的代碼縮進(jìn)風(fēng)格前后統(tǒng)一就可以了,但是在現(xiàn)實(shí)生活中我們不會(huì)也不允許千人千面,因?yàn)榇蠹疫€是要互相交流的,讓任何人去適應(yīng)別人的縮進(jìn)風(fēng)格都是低效率和不公平的,因此形成了很多約定俗成的東西,哪怕它們不合理,但是它們的確形成了,而且你最好也遵守這樣的規(guī)矩,如果你違背了這些東西,只能說(shuō)明要么你是搗亂,要么你是絕對(duì)的新手。”

                 “哦?”

                 “這些有點(diǎn)像江湖黑話,如果你不是混江湖的,在打切口的時(shí)候鬧了笑話,道上的兄弟一定會(huì)笑話你,新警察吧……”

                 “哈哈哈哈……”

                 “就我所知,目前江湖上有幾種常用的黑話格式,K&R,BSD和GNU等,無(wú)論你采用哪一種,別人看了就知道你是道上混的,而且知道了你的山頭,也就會(huì)高看你一眼……”

                 “是么?”

                 “是啊是啊,eclipse上面有黑話翻譯器,你在Window->Preference的彈出窗口,找到C/C++分類(lèi),下面有Code Style子類(lèi),你點(diǎn)選以后在右邊會(huì)出來(lái)一個(gè)下拉框,讓你選擇代碼縮進(jìn)風(fēng)格,你可以試試,選擇一個(gè)你覺(jué)得順眼的,看看模板是怎么縮進(jìn)的。”

                 “好啊,”小P在自己的電腦上搗鼓開(kāi)了,“你選的是哪一個(gè)?”小P想跟著老C混一個(gè)山頭。

                 “我選的BSD,因?yàn)楸容^向往那個(gè)學(xué)校……”老C答道。

                 “于我心有戚戚焉,”小P覺(jué)得這個(gè)理由很好,反正也沒(méi)有什么質(zhì)的區(qū)別,也就選了這個(gè)風(fēng)格。

                 “下來(lái)你在Edit菜單下選擇Format試試?”

                 “哦……嗯?真是不錯(cuò)啊。”

                 “你可以在Window->Preference中修改它的快捷鍵,只要自己覺(jué)得舒服就行。”老C補(bǔ)充到,“因?yàn)槟承喝の?,我改成了Alt+F8……哈哈。”

                 “囧。”小P沒(méi)有理會(huì)老C的傻笑,自己又試了幾下,“嗯,的確不錯(cuò)的。”

                 “好吧,我們?cè)賮?lái)說(shuō)說(shuō)命名規(guī)則,”老C喝了一口水,“這個(gè)就不像縮進(jìn)那樣有很明顯的工具可以幫你翻譯,但是也存在幾個(gè)基本的幫派,而且這里面的斗爭(zhēng)十分激烈,大家有爭(zhēng)吵不休的態(tài)勢(shì)……因?yàn)槠鹈值拇_是一項(xiàng)藝術(shù),而在藝術(shù)上主觀的成分更多一些,你看這樣好,他看那樣好……的確沒(méi)有十全十美的方法,但……我們無(wú)論采用哪一種方法一定要前后統(tǒng)一啊。我推薦你讀一下《Ottinger's Rules for Variable and Class Naming》這篇文章。”老C撓撓頭,“另外在C領(lǐng)域也有一些很有名的標(biāo)準(zhǔn),比如《MISRA C rules reference》,就是一個(gè)關(guān)于C語(yǔ)言很有名氣的標(biāo)準(zhǔn);而在C++領(lǐng)域,如果你沒(méi)有看過(guò)《C++ Coding Standards 101 Rules Guidelines and Best Practices》這本書(shū),最好不要說(shuō)自己會(huì)C++,否則會(huì)遭到道上朋友們的BS。不過(guò),不要盲目的跟隨一項(xiàng)規(guī)則,沒(méi)有好的規(guī)則,只有合適的規(guī)則,任何規(guī)則的應(yīng)用都和環(huán)境有關(guān),在某種環(huán)境下好的規(guī)則,在另外一種環(huán)境下就有可能變得很糟糕——因此,不要盲從規(guī)則,規(guī)則不能代替你自己的思考——我們需要了解某項(xiàng)規(guī)則應(yīng)用的環(huán)境,理解為什么它是好的,尤其要注意例外的情況。總之不要做狂熱的語(yǔ)言分子,不要錯(cuò)誤的認(rèn)為只有自己堅(jiān)持的那一套才是最好的,要懂得心態(tài)開(kāi)放,互相學(xué)習(xí)。”

                 “嗯,好像是這么回事。”小P若有所悟的說(shuō)到。

                 “呵呵,有些看似違背了規(guī)范的做法也可以產(chǎn)生不錯(cuò)的結(jié)果,”老C補(bǔ)充道,“尤其當(dāng)你畢業(yè)進(jìn)入一家企業(yè),如果那是一個(gè)有水準(zhǔn),有抱負(fù),有責(zé)任的企業(yè),一定會(huì)對(duì)你進(jìn)行編碼規(guī)范方面的培訓(xùn)的。雖然這些規(guī)范本身可能有這樣、那樣的不足,或者本身就違反了某些規(guī)范……但,只要大家都堅(jiān)持,采用統(tǒng)一的方式去生產(chǎn)代碼,這樣往往會(huì)產(chǎn)生好的結(jié)果。產(chǎn)生了好結(jié)果的做法就是正確的做法,而往往一些不好的結(jié)果產(chǎn)生的原因不是我們做法錯(cuò)了,而是沒(méi)有堅(jiān)持……”

                 “是么?多么希望我們的課堂上可以講講類(lèi)似的內(nèi)容啊。”小P稍微有些遺憾,“那么你一般怎么寫(xiě)程序呢?”

                 “呵呵,我自己也有一套習(xí)慣,而且也在不斷刷新……最主要的是保持一致——和你的團(tuán)隊(duì),使用的庫(kù)或者以后你的公司規(guī)定。”

                 “是啊,”小P點(diǎn)點(diǎn)頭,“要不你先給我做個(gè)示范,以后我們教研室就使用這個(gè)規(guī)范如何?”

                 “呵呵,那多不好意思……”老C一邊謙虛,一邊在紙上寫(xiě)下如下內(nèi)容,“一般用C++編碼時(shí),我習(xí)慣這樣命名……”


            #define LIKE_THIS


            int likeThis;


            void LikeThis ();


            void LikeThis()
            {
            }


            class LikeThis
            {
            public:

                void likeThis();


            private:

                int field_;
            }


            enum LikeThis;


            struct LikeThis;


            typedef int INT16;


            for (i = 0; i < 5; ++i)
            {
            }


            ......


                  “而使用C時(shí),我習(xí)慣這樣。”


            typedef enum tagLIKE_THIS {} LIKE_THIS;
            typedef struct tagLIKE_THIS {} LIKE_THIS;


                  “總之,利用大小寫(xiě)和空格區(qū)分出有用的信息,并堅(jiān)持統(tǒng)一的做法,”老C說(shuō),“我再隨便劃拉幾下,你看看有什么不同。”


            代碼片段1:


            #define m1 50


            #define m2 4


            typedef enum cars{ yugo, ford, buick, pontiac } carmakes;


            typedef struct one_carsale
            {
                 carmakes CarMake;
                 char CustomerName[m1], CarMode[m1];
                 float Cost;
                 one_carsale* NextCarSalePtr;
            }acar;



            typedef struct salesperson{
                 char SalesPersonsName[m1];
                 float CommissionRate, BaseSalary, WeeklyPaycheck;
                 acar** NextNode;
            }aperson;


            acar* NexNodePtr[m2];
            aperson Sale[m2];




            代碼片段2:


            #define MAX_NAMELENGTH 50


            #define MAX_SALESPEOPLE 4


            /* makes of cars being sold. */
            typedef enum tagCAR_MAKES { YUGO, FORD, BUICK, PONTIAC } CAR_MAKES;


            /* structure to represent each car sale. */
            typedef struct tagONE_CARSALE
            {

                CAR_MAKES     carMake_;

                char          customerName_[MAX_NAMELENGTH];

                char          carModel_[MAX_NAMELENGTH];

                float         cost_;

                ONE_CARSALE*  nextCarSalePtr_;
            }ONE_CARSALE;


            /* structure to represent each individual sales person. */
            typedef struct tagSALES_PERSON
            {

                char          salesPersonsName_[MAX_NAMELENGTH];

                float         commissionRate_;

                float         baseSalary_;

                float         weeklyPaycheck_;

                ONE_CARSALE** headerNode_;
            }ONE_SALESPERSON;


            /* declaration for non-standard array-of-pointers. */
            ONE_CARSALE* g_headerNodePtr[MAX_SALESPEOPLE];


            /* array of salespeople. */
            ONE_SALESPERSON g_salesTeam[MAX_SALESPEOPLE];


                  “嗯,片段2的代碼的確好理解一些,將一組鏈表的頭指針?lè)诺揭粋€(gè)數(shù)組中,而且從ONE_SALESPERSON類(lèi)型的對(duì)象可以索引到 ONE_CARSALE對(duì)象的鏈表?;旧喜挥觅M(fèi)什么功夫就可以理解,”小P撓撓頭,“但是片段1的代碼,雖然內(nèi)容和片段2一樣,但是……好像有些讓然看不明白啊。”小P有些不好意思,“就像我寫(xiě)的一樣……”

                 “呵呵,不要自責(zé),沒(méi)有關(guān)系的,這個(gè)是我們每個(gè)人必經(jīng)的階段……”老C安慰小P,“這些就是代碼的品質(zhì),看看一個(gè)人寫(xiě)的代碼,就知道他的思維和經(jīng)驗(yàn)。讓我們共同努力寫(xiě)出優(yōu)雅的高品質(zhì)的代碼吧。”老C作激昂狀。

                 “嗯,我一定好好看看你推薦的資料。”

                 “現(xiàn)在外表問(wèn)題我們已經(jīng)做過(guò)一些概要性的討論了,反正周末無(wú)事,我們來(lái)教研室討論一下程序的內(nèi)在如何?”老C詢(xún)問(wèn)道。

                 “好吧,時(shí)間也不早了……”

                 “我請(qǐng),我請(qǐng)……”老C一邊說(shuō),一邊摸著口袋和小P向門(mén)外走去。



            (小心后面還有坑)


             

            posted on 2009-01-21 16:53 Anderson 閱讀(1924) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

            # re: 第一桶 從C到C++ 第五碗 陳老C談編碼規(guī)范 潘小P學(xué)江湖黑話 2009-01-21 21:45 七星重劍

            很好的c/c++教程啊,當(dāng)年我學(xué)習(xí)的時(shí)候咋就沒(méi)看到這樣的好文章呢  回復(fù)  更多評(píng)論   

            # re: 第一桶 從C到C++ 第五碗 陳老C談編碼規(guī)范 潘小P學(xué)江湖黑話 2009-01-23 23:43 imnobody

            very good job,
            thanks a lot  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2009年9月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(6)

            隨筆檔案(21)

            文章檔案(1)

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久se这里只有精品| 少妇被又大又粗又爽毛片久久黑人| 亚洲国产精品一区二区三区久久| 四虎国产精品免费久久5151| 久久av无码专区亚洲av桃花岛| 国内高清久久久久久| 一本大道久久东京热无码AV | 欧洲人妻丰满av无码久久不卡 | 久久精品国产亚洲av瑜伽| 久久线看观看精品香蕉国产| 国产精品福利一区二区久久| 国内精品久久久久久久97牛牛| 国产亚洲欧美精品久久久| 久久久久人妻一区精品性色av| 91精品国产综合久久久久久| 久久精品一本到99热免费| 国产精品无码久久综合| 国产精品一久久香蕉国产线看 | 久久午夜福利无码1000合集| 久久亚洲精品国产精品婷婷| 怡红院日本一道日本久久| 99久久精品免费看国产免费| 国内精品欧美久久精品| 色偷偷88欧美精品久久久| 国产精品久久久久久久久久影院| 亚洲欧美日韩久久精品第一区| 久久久久亚洲Av无码专| 亚洲国产精品久久| 亚洲伊人久久综合中文成人网| 亚洲午夜久久久久久久久电影网| 久久精品午夜一区二区福利| 99久久精品无码一区二区毛片 | 久久99中文字幕久久| 欧美久久一级内射wwwwww.| 久久人妻无码中文字幕| 久久久亚洲欧洲日产国码二区| 国产精品美女久久久久av爽| 97精品依人久久久大香线蕉97| 久久青青草原综合伊人| 精品国产日韩久久亚洲| 高清免费久久午夜精品|