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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    漂亮的代碼

    Posted on 2008-10-09 23:58 dennis 閱讀(3075) 評論(4)  編輯  收藏 所屬分類: 涂鴉計算機科學與基礎
        Ruby的創造者為《代碼之美》撰寫的文章標題是《代碼如散文》。程序和散文有一些共性,首先是兩者都必須有清晰的意圖,散文內容是什么,想表達什么,程序的功能是什么,能做什么;其次兩者在意圖的表達上(功能的實現上)都依賴于寫作的具體風格,編程的隱喻之一就是寫作。你想表達的思想是好的,但是如果表達得難以理解,那么要把這個思想傳播給讀者將非常困難。代碼被讀和修改的次數是相當多的,因此一個很重要的觀點就是你寫的代碼是給人讀的,你需要考慮可讀性的問題,歸結于寫出漂亮的代碼。
       判斷代碼是否漂亮似乎沒有什么國家標準,更沒有國家免檢。代碼是寫給人讀的,從這個角度上看,如果一段代碼能讓人很容易地讀懂,讓人感覺心情愉快,修改起來也不費什么力氣,這似乎就是漂亮的代碼咯。那么顯然,漂亮的代碼的真正含義是幫助程序員感到快樂和提高生產率。有了這個指導性的方向,你可以從這么幾個方面去努力寫出漂亮的代碼:簡潔性、保守性、簡單性、靈活性和平衡。
       簡潔性,文中以Ruby和Java版本的Hello World入手比較,在Ruby和其他動態語言中,你所做的就是你想表達的:打印Hello World
    print "Hello World\n"
    換成java,哦,你先要定義一個類,這個類有個入口main方法,在main方法中調用System.out對象的println方法打印:
    class Sample{
       
    public static void main(String []args){
         System.out.println(
    "Hello World");
       }
    }
    我記的我初學java的時候就特別不理解為什么要定義一個類,為什么方法要static、args,而我僅僅想要的只是打印一個字符串,可語言硬塞給了我太多的概念:類、方法、入口、參數。這些額外的東西牽扯了太多的注意力,而往往卻忘記了初衷是什么。因此在《unix編程藝術》一書中對OO的一個評價是:鼓勵具有厚重的膠合和復雜層次的體系,大大降低了代碼的簡潔性和透明性,你無法一眼看出代碼是想做什么的。OO的抽象能力很強大,因此在很多場景下是這種抽象能力的濫用,實現最簡單的功能也是一定要有類,有類才有對象,有對象才有光:)而往往這些對象卻非問題領域中的自然實體,而是某種膠合物,為了抽象而抽象。
       簡潔同樣意味著消除冗余。代碼的重復是萬惡之源,拷貝黏貼是滋生bug的溫床,在重構概念如此深入人心的今天,這一點毋庸置疑。因此,謹記請DRY原則。語言級別的冗余可能是需要的,例如Ruby允許方法調用省略括號:
    task :name=>:test
    task({:name
    =>:test})

    這兩行代碼想表達的意思一樣,顯然第一種方式更簡潔,這種語言級別的冗余顯然是有利于程序員的,盡管將實現的難度推給了語言的設計和實現者。
       漂亮代碼另一個有爭議的方面就是它的熟悉性,人們對于新東西的接受程度遠沒有想象中的高,大家都喜歡自己熟悉的東西而非全新的思考方式(嗯,極客例外)。這其實是Ruby一直鼓吹的最小驚奇原則的另一種表達。Ruby看來就是這么個保守的語言,他有很強大的OO能力,但是沒有全然照搬smalltalk,他有FP的能力但是卻沒有讓你驚掉下巴,他仍然遵循著古老的順序、循環、選擇的程序結構。
       簡單性強調是減輕程序員的工作負擔,語言和類庫API的優化應當有利于使用者,將困難留給實現者。前面提到的語言的冗余性就是一例。程序的復雜性來源有這么幾個:商業上基于推銷熱點而非實際需求考慮出發帶來的“特性清單”、業務領域本身的復雜度、程序員的自傲心理,最根本在于軟件的開發的復雜性。如果能將復雜的功能,用人人理解的簡單代碼表達出來,當然漂亮!
       簡單并不意味著簡陋,保守也不意味著死板。靈活性同樣是代碼漂亮與否的判斷標準,是否隔離了變化點,是否擁有一定的擴展能力,是否無需借助工具的增強而實現某些巧妙的調用。同樣以Ruby為例,open class和元編程給了內置你在語言級別的“工具”,你無需借助antlr、cglib等等類庫去做一些看似復雜的東西。你將感受到編程的快樂,而非為了工具而去做一些違背本意的事情。靈活性可能是把雙刃劍,過分的強調靈活性、可擴展性也可能帶來復雜的代碼,注意你的“炫耀”心理。
       最后要強調的是平衡,在這些因素之間做出平衡,我覺的吧,沒有更多實踐的經驗想平衡這些因素是相當困難的,如果了解了平衡的藝術,也許算是透出那么點“編程的藝術”的味道。Matz一直強調的一點是編程的樂趣,如果沒有樂趣,我想我不會干這行,如果沒有樂趣,我想我的工作效率將極度低下,從你認為是枯燥的工作中找樂子,存了這么個心理,你總能找出很多可以做的有趣事情,問題在于,你肯不肯做?

    ps.加張圖片,俺的blog國家免檢

      


    評論

    # re: 漂亮的代碼  回復  更多評論   

    2008-10-10 08:33 by Jack.Wang
    說的不錯!

    # re: 漂亮的代碼  回復  更多評論   

    2008-10-10 08:50 by yeshucheng
    哥們,太喜歡看你的BLOG。夠務實,夠扎實!

    # re: 漂亮的代碼[未登錄]  回復  更多評論   

    2008-10-10 09:14 by Leon
    Hello world那個例子舉得太好了,深得我心啊!
    當初剛接觸Java的時候也是被這個搞得一頭霧水,頓時覺得OO的世界如此之可怕-_-

    不過話又說回來了,在樂趣和秩序之間,究竟有沒有平衡點?我覺得Ruby/Rails的項目一旦規模上去之后,協作是個大問題,可以參見hideto的帖子:
    http://www.javaeye.com/topic/233800

    不知道Dennis怎么認為?


    # re: 漂亮的代碼  回復  更多評論   

    2008-10-10 12:35 by dennis
    @yeshucheng
    過獎,謝謝關注
    @Leon
    盡管Ruby可以many way to do one thing,但總體上講,仍然是有一些慣用法的。我認為可以在團隊內部開展這種慣用法培訓,讓大家都上去講,就幾種寫法發布看法,這不僅僅是交流的需要,也講促進知識的共享,長期下去,我相信團隊的代碼風格可以趨同
    主站蜘蛛池模板: a级毛片无码免费真人| 四虎成人精品国产永久免费无码| 成年网在线观看免费观看网址| 91嫩草免费国产永久入口| 亚洲av永久无码精品国产精品| 曰批免费视频播放在线看片二| 毛片免费全部免费观看| 亚洲视频在线观看网址| 无码国产精品一区二区免费模式 | 精品国产免费一区二区| 亚洲成av人无码亚洲成av人| 久久久久久久久久免免费精品| 尤物永久免费AV无码网站| 亚洲国产亚洲片在线观看播放 | 卡1卡2卡3卡4卡5免费视频| 亚洲成人福利在线| 一级毛片免费毛片一级毛片免费| 久久精品国产亚洲沈樵| 中国性猛交xxxxx免费看| 亚洲一区精品伊人久久伊人| 日韩大片在线永久免费观看网站| 在线免费观看国产视频| 亚洲av无码成人精品区一本二本 | 日韩精品电影一区亚洲| 亚洲色无码国产精品网站可下载| 国产精品免费高清在线观看| 国产av无码专区亚洲av桃花庵| 日本高清不卡aⅴ免费网站| 亚洲国产另类久久久精品| 两个人看的www免费视频| 久久亚洲国产成人亚| 三年片在线观看免费观看大全一| 亚洲AV无码乱码国产麻豆| 国内精品99亚洲免费高清| 水蜜桃亚洲一二三四在线| 国产人在线成免费视频| 色吊丝性永久免费看码 | 久9久9精品免费观看| 亚洲kkk4444在线观看| 国产精品亚洲美女久久久| 18禁美女黄网站色大片免费观看|