溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

<<代碼整潔之道(clean code)>>讀書重點(diǎn)筆記

發(fā)布時(shí)間:2020-07-20 08:19:11 來源:網(wǎng)絡(luò) 閱讀:1578 作者:落寞三少 欄目:軟件技術(shù)

整潔的代碼

1.習(xí)藝之要

   1).知:習(xí)得有關(guān)原則、模式和實(shí)踐的知識,窮盡應(yīng)知之事,并且要對其了如指掌

   2).行:通過刻苦實(shí)踐掌握它


2.閱讀本書原因

  1)。你是個(gè)程序員

  2)。你想成為更好的程序員


3.勒布朗法則:

   稍后等于永不


4.花時(shí)間保持代碼整潔不但有關(guān)效率,還有關(guān)生存


5.程序員遵從不了解混亂風(fēng)險(xiǎn)的經(jīng)理的意愿,也是不專業(yè)的做法


6.趕上期限的唯一方法,做得快的唯一方法----就是始終盡可能保持代碼整潔


7.破窗理論


8.整潔的代碼只做好一件事

  力求集中,每個(gè)函數(shù)、每個(gè)類、模塊都全神貫注于一事,完全不受四周細(xì)節(jié)的干擾和污染


9.整潔的代碼應(yīng)當(dāng)明確展現(xiàn)出要解決問題的張力


10.簡單代碼規(guī)則:

       按重要順序:

          .能通過所有測試

           沒有重復(fù)代碼

           體現(xiàn)系統(tǒng)中的全部設(shè)計(jì)理念

           包括盡量少的實(shí)體,比如類、方法、函數(shù)等

   無重復(fù)代碼:

        如果同一段代碼反復(fù)出現(xiàn),就表示某種想法未在代碼中得到良好的體現(xiàn),應(yīng)該盡力

        去找出到底那是什么,然后再盡力更清晰地表達(dá)出來


 11.提高表達(dá)力

    1)。有意義的命名

    2)。只做一件事

    3)。小規(guī)模抽象


 12.想要干得快、想要早點(diǎn)做完、想要輕松寫代碼,先讓代碼易讀



 有意義的命名


 1.一旦發(fā)現(xiàn)有更好的名稱,就換掉舊的


 2.名副其實(shí)

    如果名稱需要注釋來補(bǔ)充,就不是名副其實(shí)


 3.避免誤導(dǎo)

   做有意義的區(qū)分

   使用讀得出來的名稱

   使用可搜索的名稱

      如:MAX_CLASSES_PRE_STUDENT

  

 4.類名

    類名和對象名應(yīng)該是名詞或名詞短語,如Customer WikiPage Account

    AddressParser

    不應(yīng)該是動(dòng)詞

  

 5.方法名

     應(yīng)該是動(dòng)詞或動(dòng)詞短語,如postPayment deletePage save

     屬性訪問器、修改器、斷言,應(yīng)該根據(jù)其命名前加上get、set、is前綴



函數(shù)


1.短小是函數(shù)的第一規(guī)則


2.只做一件事,做好這件事


3.每個(gè)函數(shù)一個(gè)抽象層級

   如 getHtml() 高

      PathParser.render(pagePath) 中

      .append("\n") 低

   函數(shù)中混雜不同的抽象層級,會(huì)讓人迷惑

   自頂向下讀代碼:向下規(guī)則


4.函數(shù)參數(shù)

  最理想的參數(shù)是零(零參數(shù)函數(shù)),其次是一,盡量避免三個(gè)參數(shù)及以上的函數(shù)

  從測試角度,參數(shù)越多越難測


5.轉(zhuǎn)換結(jié)果的函數(shù)應(yīng)該體現(xiàn)在返回值


6.應(yīng)該盡量將二元函數(shù)轉(zhuǎn)換為一元函數(shù)(元:參數(shù)個(gè)數(shù))


7.參數(shù)對象

  如果函數(shù)看來需要三個(gè)或以上參數(shù),說明其中一些參數(shù)應(yīng)該封閉為類

  如:

    Circle makeCircle(double x, double y, double radius);

    |

    Circle makeCircle(Point center, double radius);


  從參數(shù)創(chuàng)建對象,從而減少參數(shù)數(shù)量,當(dāng)一組參數(shù)被共同傳遞,往往就是該有自己名稱的某個(gè)概念的一部分


8.動(dòng)詞與關(guān)鍵詞

  給函數(shù)取好名字,能較好地解釋函數(shù)的意圖,以及參數(shù)的順序和意圖

  如一元函數(shù) writeFile(name) 動(dòng)詞/名詞


  將參數(shù)的名稱編碼成函數(shù)名,如

   assertEqual->assertExceptedEqualsActual(excepted, actual)


9.避免使用輸出參數(shù),如果函數(shù)必須修改某種狀態(tài),就修改所屬對象的狀態(tài)

    面向?qū)ο笳Z言中對輸出參數(shù)的大部分需要已經(jīng)消失,因?yàn)閠his也有輸出參數(shù)的意味


10.分隔指令與詢問

    public boolean set(String attribute, String value);

    

    if(set("username", "unclebob"))...


    上述為指令與詢問都在set函數(shù)中,應(yīng)該改為

    if(attributeExists("username")) {

        setAttribute("username", "unclebob")

    }


11.使用異常替代返回錯(cuò)誤碼

    try {

        deletePage(page);

        registry.deleteReference(page.name);

        configKeys.deleteKey(page.name.makeKey());

    }catch (Exception e) {

        logger.log(e.getMessage())

    }

    

    完美的隔離(try catch 代碼塊主體抽離 )


    public void delete(Page page) {

        try{

            deletePageAndAllReferences(page);

        }catch (Exception e) {

            logError(e);

        }

    }


    private void deletePageAndAllReferences(Page page) throws Exception {

        deltePage(page);

        registry.deleteReference(page.name);

        configKeys.deleteKey(page.name.makeKey());

    }


    private void logError(Exception e)

    {

        logger.log(e.getMessage());

    }


12.錯(cuò)誤處理就是一件事

   如上述代碼,如果關(guān)鍵詞try在某個(gè)函數(shù)中存在,它就是該函數(shù)的第一個(gè)單詞,而且在catch/finally代碼塊后面也不該有

   其他的內(nèi)容


13.依賴磁鐵

   public enum Error {

        OK,

        INVALID,

        NO_SUCH,

        LOCKED;


   }

    

   使用異常替代錯(cuò)誤碼,新異常就可以從異常類派生出來,無需重新編譯或重新部署


14.重復(fù)可能是軟件中一切邪惡的根源


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI