2014-02-14

[讀書筆記] Clean Code Part 1 (Ch1 to Ch3)

Chapter 1 : Clean Code

(1) 童子軍規則 - 讓營地比你來時更乾淨!!
     儘管Legacy code很多 但每一次比每一次乾淨也是件好事

Chapter 2 : Meaningful Names

(1) 名副其實
       Bad : int d;
       Good : int elapsedTimeInDays;

(2) 避免誤導
       如果你的變數型態不是List
       Bad : accountList
       Good : accountGroup or accounts

(3) 做有意義的區分
       不使用意義含混的廢話(Info, Data, a, an, the)
       ex. ProfuctInfo, aProduct

(4) 避免把類型或者變數範圍編碼進名稱    
      如果未來類別改變 還要記得改變數會很麻煩
      如果變數未改 又會造成誤導
      ex. 原本宣告 PhoneString phoneString
           後來改類別 PhoneNumber phoneString
           phoneString這變數名稱會誤導下一個開發者

(5) Interface
      不對介面類別名稱作編碼
        IShapreFactory
      寧可針對實作類別名稱作編碼
        ShapreFactory
ShapreFactoryImp

(6) Class
      類別名稱應該是名詞或名詞短語

(7) Function or Method
      函式名稱應該是動詞或動詞短語

Chapter 3 : Functions

(1) Small & Do one thing
       函數應該做一件事情,做好這件事情,只做這一件事情
       所以Function應該要短

(2) Function Arguments
       參數數量越少越好
       如果參數數量無法降低 那代表你必須要開始封裝參數
       ex.
       Circle makeCircle(double x, double y, double radius)
       Circle makeCircle(Point center, double radius)

(3) Boolean Arguments
       如果你想要用一個Boolean值去當開關
       Ex. SetJugService(true) // Start Jug Service
             SetJugService(false) // Stop Jug Service

       上面作法的缺點在於:
       1. 參數僵化成2選1
       2. Function內必須有if邏輯

       你倒不如設計成
       StartJugService()
       StopJugService()

(4) Command Query Separation
       The real solution is to separate the command from the query so that the ambiguity cannot occur.

       if( set("username","jug"))...
       Function 應該一次做一件事 要嘛回答問題 要嘛執行動作
       上述 function 會讓reader混淆
     
      有些人會將 set 改成 setAndCheckIfExists
      但是對於閱讀仍舊沒有幫助
 
      比較適合的作法是 :
      if(attributeExists(“username”))
          setAttribute(“username”, “jug”);

(5) Don’t Repeat Yourself
        Duplication may be the root of all evil in software.
       如果code一再重複 表示你可以將code抽出來處理

0 意見: