2019年12月4日 星期三

讀書心得 - Clean Code - Chapter 4

Chapter 4 - 註解

不要替糟糕的程式碼寫註解 - 重寫它


    註解為必要之惡,用來彌補我們用程式碼表達意圖失敗的狀況。註解在絕大多數的情況無法跟著程式演進,導致過時且偏離當初的程式碼解釋。最後的真相只會存於程式碼。

有益的註解

    法律型的註解
    // Copyright 2011-2019 The Bootstrap Authors
    // Copyright 2011-2019 Twitter, Inc.
    資訊型註解
    資訊型註解提供一些基本資訊,但還是很容易被好的程式碼命名給取代
     // Returns an instance of the Responder being tested.
     protected abstract Responder responderInstance();
    對意圖的解釋
     // This is our best attempt to get a race condition
     // by creating large number of threads.
    對後果的告誡
     // Don't run unless you
     // have some time to kill

     // SimpleDateFormat is not thread safe,
     // so we need to create each instance independently

上一篇:
讀書心得 - Clean Code - Chapter 3 (2)
下一篇:
讀書心得 - Clean Code - Chapter 5

2019年12月3日 星期二

讀書心得 - Clean Code - Chapter 3 (2)

Chapter 3 - 函式 - 2

使用具描述能力的名稱


    不要害怕名字過長,若取了有性質的函式名稱就較能符合「當每個你看到的函式,執行結果都與你想的差不多代表為 Clean Code」

函式的參數


    函式的參數越少越好,因為參數的存在也會影響著你對函式的預期,所以最理想的情況為 0 參數。
    一個參數
  1. 與這個參數有關的問題  - boolean fileExits("Myfile")
  2. 對這個參數做某種操作,然後回傳 - InputStream fileOpen("Myfile")
  3. 事件,利用參數去修改系統狀態 - passwordAttemptFailedNtimes(int attempts)
    第三種命名要特別小心,要明確的表示出此函式為事件。若參數為 flag 那你要知道此為很爛的作法,flag 就代表 True 要做一件事,False 要做一件事,違反了只做一件事的原則。
    兩 ~ 三個參數
    兩個參數影響函式的預期就更多,所以可以轉成一個參數就好好利用。
    物件型態的參數、參數串列
    利用物件型態或陣列去減少參數個數是不錯的方法
    Circle makeCircle(double x, double y, double radius);
    Circle makeCircle(point center, double radius);

指令和查詢的分離


    如果函式除了做某件事情後,還回傳了某個問題的答案,就等於做兩件事
    public boolean set(String attribute, String value);
    if(set("username", "unclebob"))...
    所以讀者看到此段 if 會容易產生誤解且疑惑,所以要將查詢與指令分開
    if(attributeExists("username")){
        setAttribute("username", "unclebob");
        ...
    }
    利用例外處理取代回傳錯誤碼
    錯誤處理本身就是一件事

Don't Repeat Yourself


   n 個重複的程式碼,代表修改要花 n 倍時間。

上一篇:
讀書心得 - Clean Code - Chapter 3 (1)
下一篇:
讀書心得 - Clean Code - Chapter 4

2019年12月2日 星期一

讀書心得 - Clean Code - Chapter 3 (1)

Chapter 3 - 函式 - 1

首要準則 - 簡短!!


    即使現今編輯器能讓你在一行塞入 150 個英文字母,現今螢幕能讓你顯示 100 行,你也不該塞好塞滿。越短越好,3 ~ 4 行,每個函式都透漏著本身的意圖且帶領著你至下個函式。
    區塊 ( Blocks ) 和縮排 ( Indenting )
    If、else、while 都應該只有 1 行,而那行通常會是個命名不錯的函式。

只做一件事


    只做一件事很難下定義,以下提出兩種
  1. 透過觀察函式中進而提煉出一個新的函式來
  2. 函式裡有明顯的段落 ( 宣告區、初始區、過濾區... )

只有一層抽象概念


    為了確保只做一件事,就必須確保函式裡都是同一層次的概念。
  • getHtml()      - 高層次
  • parsePath()    - 中層次
  • .append("\n")  - 低層次
    降階準則
    閱讀程式碼通常都是由上而下,所以層次也該從上到下

Switch 敘述


    switch 要簡短很困難且很容易跟上述規則牴觸,作者這裡是利用 Polymorphism ( 多型 ) 將 switch 壓到低的層次且不會被重複利用。

Popular Posts