<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 193,  comments - 520,  trackbacks - 0

    什么代碼才是好代碼?這真是個老得能拔掉牙齒的話題。好吧,那讓我們再在這刮沙塵暴的無聊時光里重復一次。好的代碼要是易讀的代碼、要做到職責分離、要做到單一職責、要有高的執(zhí)行效率....

    等等,等等,這才抽象了,太書面化了。我只是一個菜鳥,剛寫代碼幾年,也沒念過什么書,能不能說得通俗易懂一些?

    好吧,我停下來,想,這真是個難纏的家伙。我說,這樣吧,我推薦幾本書你去看吧,《重構》熊節(jié)最近再版了,建議你去買一本。恩,等等,有個省錢的招,去圖靈俱樂部討論組注冊下,蹭贈書也很爽,哈哈。

    可是,你還沒告訴我什么代碼才是好代碼呢?知道你也沒什么好答案,我自己來說好了。

    省略掉此時我內心花花的汗水,下面是菜鳥的敘述:

    1.一致
    我發(fā)現(xiàn)自己有輕微的強迫癥,當我碰到以下代碼時,我就會沖動。
    沖動前代碼:
    def imgName
    if(XXX){
       imgName="meigui"
    }else{
       imgName=""
    }
    沖動后代碼:
    def imgName=XXX?"meigui":""

    盡管兩段代碼功能一致,但一旦我發(fā)現(xiàn)出現(xiàn)沖動前代碼時,我就會感到不舒服,感到難受,就好像看到閱兵正步走不齊一樣。方法名也是一樣:
    沖動前:
    def testXXX(){}
    沖動后:
    def should_XXX_when_XXX(){}

    變量亦是如此:
    沖動前:
    def imgNode=resouce.adoptTo(Node)
    沖動后:
    def node=resouce.adoptTo(Node)

    總之,我不愿意看到同一個事情有兩種實現(xiàn)方式,如果功能類似,那么不管是邏輯還是變量、方法名,我會強迫一致,整齊劃一。

    關于一致,從調試代碼的角度看,零星的不一致比大量的不一致更加糟糕,因為這時大部分地方的一致性會令人麻痹大意。在實現(xiàn)查詢分頁功能時,我們有這樣一行代碼:
    nodeIterator.size
    這行代碼的意思是獲取查詢結果的總數(shù),大部分情況下它工作良好,但是在一種特殊情況下它返回了-1。這對我當時幾乎是災難性的,因為調試過程中我們始終相信這行代碼的行為一致,結果是花費了一個下午才找到這個問題。

    2.簡潔
    我喜歡短的代碼,對我而言,短的程序總是比更長一些的代碼容易理解,小學時學課文就已經(jīng)這樣了,一看到大段的段落我總是會暈過去(特別是文言文,首先我就 對自己理解這段文字失去了信心)。這里要提到注釋,即是這些注釋明確是為了提高代碼的可讀性,也會增加我閱讀代碼的困難,所以我不會在方法里的任何位置添 加注釋,撐死在個別方法聲明前添加,并且這種情況也盡量避免,如果這個類確實包含了重要的不易理解的算法,我也只會在類聲明前添加注釋。

    關于自然語言,有一個基于經(jīng)驗的結論被稱為Zipf定律,即:自然語言中最常用到的單詞,其長度會趨于最短。

    我寫代碼的時候,能夠簡寫盡量簡寫,例如,變量名,imageNode,我一定會寫成imgNode;方法名procedureXXX,我一定會寫成 procXXX,和討厭大段代碼一樣,我非常討厭命名很長的方法名和變量名,盡管這些名稱這么長是為了更好的增加可讀性,但可讀性不是這樣增加的。

    在我的第一份代碼工作里,我們使用拼音來命名方法和變量(還好,沒有包括類名),我討厭這種命名方式的原因并不是因為我的語文老師不好以至于我前后鼻音不分,而是這種寫法根本排除了簡寫的可能性,甚至,為了避免歧義,有時不得不變得更長。

    3.聯(lián)覺和順序
    關于記憶,人類有兩種重要的記憶能力:聯(lián)覺和順序記憶。

    關于聯(lián)覺,一個例子是:你總可以一眼記住一個人的臉,比如范冰冰,盡管我到現(xiàn)在也不清楚她到底是單眼皮還是雙眼皮,也不清楚她到底是厚嘴唇還是薄嘴唇。

    那么,在代碼里,這里的表現(xiàn)就是局部,即一個功能的所有相關代碼都集中在一個地方。我最討厭的代碼是這樣的:最開始我打開一個文件,在閱讀的過程中,我發(fā) 現(xiàn)一個不清楚的方法,于是我按下ctrl并點擊鼠標,于是我跳到另外一個文件;接下來,在閱讀另外一個方法里,我再次發(fā)現(xiàn)了一個不清楚的方法,于是我再次 按下ctrl并點擊鼠標,哇哈,新的文件打開了....如此反復,終于當我打開最后一個文件時,我發(fā)現(xiàn)IDE的文件條里已經(jīng)密密麻麻的排滿了好幾排文件, 于是,我移動鼠標,右鍵,彈出一個關閉菜單,我選擇了close others,瞬間,哦米拖佛,整個世界清靜了,但是,等等,我最初是打算干嘛來著?

    所以,請把所有相關聯(lián)的代碼都集中在一個地方,求您了。哦,對了,能不用接口請不要用接口,總會碰到這樣的情況,打開好幾排的文件,接口文件占了一半,我靠,少幾個接口會死啊。對了,這可能是您的一致性心理在作怪,對不起,對不起。

    關于局部,一個范例同樣與調試有關,在很久之前的一次調試中,我們始終找不到一個變量錯誤的原因,因為在這段代碼里,根本找不到任何錯誤,很久以后,終于 發(fā)現(xiàn),這個變量竟然是個全局變量,嘿嘿,告訴你吧,這個變量在servlet里,04年的時候,網(wǎng)上很火的一篇文章,標題就是:不要在servlet里使 用全局變量!

    關于順序,最典型的例子出現(xiàn)在高中化學里,我總也不能瞬間說出第12、13個化學元素是什么,我通常會這樣記憶:氫氦鋰鈹硼碳氮氧氟氖鈉鎂鋁硅磷,啊哈,第12個元素是鎂,第13個元素時鋁,合起來就是--美女!

    所以,在代碼里,請將互相調用的方法按順序擺放,方法1先調用了方法2,那么請將方法2緊放在方法1后邊。我討厭這樣的配置:打開方法1,發(fā)現(xiàn)其調用了方 法2,點擊方法2,編輯器里的滾動條瞬間從最上端滾到最下端,緊接著,滾動條又從最下端滾動到中間,再接著,又是最下端,接著,歸零到最上端....人生 經(jīng)不起這樣的大起大落,真的,那得要多么大的心臟啊,麥蒂才有過那么一次,13秒....

    還有,知道為什么goto為什么那么臭名昭著了吧。

    4.自然
    使得代碼具有輕松的表達方式,同時把錯誤率降到最低,一種最重要的方法就是代碼變得“自然”,即向自然語言靠攏。因為代碼并不僅僅是與機器交流的,更重要的是,需要在人之間交流。

    機器語言到高級語言,面向過程語言到面向對象語言,jdbc到hibernate,java到動態(tài)語言,這些都促使代碼變得更加自然。

    Ruby里有個不起眼的特性,就是方法調用不用再寫括號,這一特性是如此的微不足道但是卻被很多人津津樂道,原因就是它更加自然,更加貼近我們的自然語言。于是,我看到,我的同事曉娜,在groovy里,一遍遍的將她力所能及的括號去掉。

    此外,程序語言和自然語言是有區(qū)別的,除了不能在代碼里利用感情詞抒發(fā)情感之外(我想,如果可以,一定會看到很多的馮特),程序語言沒有口語。很少看到程 序員之間這樣交流,來吧,我們來說段代碼(當然也有,徐昊就可以,哈哈),他們更多的會使用白板和筆或者直接是編輯器。所以,結束招聘時是否需要筆試的爭 論吧,我真為那些不經(jīng)過筆試就直接招人的公司感到羞愧,因為他們根本就不懂程序語言。

    此處省略華麗的分割線。

    此文謝謝我們項目組WGSN的激烈討論,謝謝討論中徐昊的精彩點評。



    http://www.tkk7.com/ronghao 榮浩原創(chuàng),轉載請注明出處:)
    posted on 2010-03-21 22:27 ronghao 閱讀(2133) 評論(2)  編輯  收藏 所屬分類: 工作日志

    FeedBack:
    # re: 心理學,再談好代碼
    2010-03-22 02:09 | leekiang
    沒有解決溫飽的還是先解決溫飽吧。
    另外我覺得,做這些錦上添花的事情之前得有完善的單元測試,您也是這樣認為的嗎?  回復  更多評論
      
    # re: 心理學,再談好代碼
    2010-03-22 21:31 | ronghao
    @leekiang
    這個不是重構,所以一開始需要統(tǒng)一,不需要測試。

    另外,這個只是從心理方面說說,不是標準。  回復  更多評論
      
    <2010年3月>
    28123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    關注工作流和企業(yè)業(yè)務流程改進。現(xiàn)就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

    常用鏈接

    留言簿(38)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    常去的網(wǎng)站

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费精品一区二区三区在线观看| 亚洲jizzjizz在线播放久| 国产免费爽爽视频免费可以看| 国产免费人人看大香伊| 亚洲国产激情一区二区三区| 免费鲁丝片一级观看| 亚洲国产精品国产自在在线 | 免费看国产成年无码AV片| 免费观看的a级毛片的网站| 亚洲欧洲久久久精品| 免费国产不卡午夜福在线 | 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | 激情综合亚洲色婷婷五月APP| 91在线精品亚洲一区二区| 亚洲AV日韩综合一区尤物| 日韩毛片一区视频免费| 国产成人精品免费久久久久| 成人黄18免费视频| 午夜男人一级毛片免费| 亚洲免费在线观看| 亚洲色成人网一二三区| 国产亚洲精品国产福利在线观看| 久久99青青精品免费观看| 久久久久成人精品免费播放动漫| 成人无遮挡裸免费视频在线观看 | 亚洲国产精品一区二区第一页免 | 亚洲欧洲自拍拍偷午夜色| 亚洲国产高清在线精品一区| 国产亚洲精品2021自在线| 最近免费mv在线电影| 免费精品人在线二线三线区别| 综合亚洲伊人午夜网| 亚洲精品高清国产一久久| 亚洲av永久中文无码精品综合 | 亚洲精品国产高清嫩草影院| 亚洲资源在线观看| 亚洲一线产区二线产区精华| 免费在线观看一区| av无码国产在线看免费网站| 国产亚洲精品AA片在线观看不加载| 亚洲国产成人手机在线电影bd|