category: develop

Clean Code(無暇的程式碼) - Note

on 2014-03-08

Clean Code(無暇的程式碼) - Note

無瑕的程式碼.jpg

最近跟同事借了這本書, 主要是因為以前沒寫過大專案, 在寫大專案被主管指出有不少的地方邏輯有問題, 變數的命名也有許多問題, 剛好有同事有這本書, 便借來閱讀, 以增進自己的功力, 書中作者是以 Java 為例, 但寫一個 Clean Code 是不分程式語言的.

以下算是閱讀筆記

劣質的程式碼導致了這家公司的倒閉 無暇的程式碼 P.3

我喜歡我程式優雅又有效率. 邏輯直接了當, 使得錯誤無處可躲. 儘量降低程式的相依性, 以減輕維護上的工夫. 根據清楚的策略, 完備處理錯誤的程式碼. 盡可能的最佳化程式效能, 以避免引起他人, 因對於程式進行無章法的最佳化, 而把程式弄得一團亂. Clean Code 只做好一件事. 無暇的程式碼 P.8

Clean Code 是可被原作者以外的開發者閱讀與增強的. …… 無暇的程式碼 P.10

當每個你看到的程式, 執行結果都與你想的差不多, 你會察覺到你正工作在 Clean Code 之上. …… 無暇的程式碼 P.11

……所以讓程式碼更容易閱讀, 也會讓程式碼變得更容易撰寫. 無暇的程式碼 P.16

  • 有意義的命名

    • 使名稱代表意圖
    • 避免編碼
  • 函數

    • 簡短
    • 避免形成巢狀
    • 只做一件事
    • 形成由上往下閱讀的程式碼
    • 減少需要參數量
    • 不要重複

函式應該只做一件事. 它們應該把這件事做好. 而且他們應該只做這件事. 無暇的程式碼 P.41

不要替糟糕的程式碼寫註解 - 重寫它 Brian W.Kernighan(布萊恩.格尼漢) 和 P.J. Plaugher(普勞賀)

  • 註解

    • 用程式碼表達你的本意
    • 法律型註解
    • 資訊型註解
    • 對意圖的解釋
    • TODO
    • 當可以使用函式或變數時就別使用註解
  • 編排

    • 空白間隔
    • 由上往下閱讀
      • 函數的宣告放置於呼叫該函數的下方
      • 以空白的一行區隔
      • 運算子以空白區隔
      • 縮排
  • 物件及資料結構

    • 資料抽象化
    • 資料結構化 物件化

結構化的程式碼(使用資料結構的程式碼)容易添加函式, 而不需要變動已有的資料結構. 而物件導向的程式碼難以添加新的函式, 因為必須改變所有類別. 無暇的程式碼 P.109

Read more

Coding Style

on 2013-09-10

Coding Style

條件判斷

在 PHP & JavaScript 中有許多邏輯判斷 當有許多條件要去檢查時, 一般來說就是用 if 一直寫下去 最後就造成下面的情況(以 PHP 為例)

if ($a === $b)
{
    if ($c)
    {
        if ($c >= 10)
        {
            if ($d)
            {
                // do something
                // ...
            }
        return;
        }
    return;
    }
}

這樣下去就沒完沒了, 而且縮排會越來越多, 要看 code 也很不方便 所以假如就已作條件檢查來說 可以用以下的做法

// check condition 1
if ($a !== $b)
{
    return;
}

// check condition 2
if (!$c || $c === '')
{
    return;
}

// check condition 3
if ($c < 9)
{
    return;
}

// check condition 4
if (!d)
{
    return;
}

// do something
// ...

做個 反向思考 , 把不適合的條件列出再一一 return or 作處理 剩下的便是所需要的

從巢狀式結構變成區域式 結構也較為清晰 debug 也較容易

有時也會遇到應該用 switch 卻用 if 去一直加下去的情況 所以當 if 用到 3 個 以上時, 就要思考要用什麼敘述來達到目的比較好 也許可以用 switch

function

有時遇到很多 code 重複時, 我們可以抽離這些重複的部分, 把它放到一個 function 中 要用時在再去呼叫那個 function

Refer-代码的抽象三原则

以錯誤為優先處理

JavaScript

function doSomething(data) {
    if (data.status === 'fail') {
        // handle error
    } else {
        // handle ok
    }
}

Read more