Clean Code 無瑕的程式碼 第10章 類別
第十章作者用Java的類別做範例,文中會提到開放-閉合原則(Open-Closes Principle, OCP)與相依性反向原則,初次看到的讀者一定不太懂,可參考作者其他作品或其他作者的書籍,再回來看第十章會比較容易理解。
類別的結構
Java的類別結構如下
公用靜態常數
私有靜態變數
私有實體變數
公用函數
私有函數
封裝
有時候為了測試程式,要用保護(protected)取代私有。
類別要夠簡短
作者認為類別要越簡短越好,從「職責的數量」判斷類別的長短。
10-1 是錯誤示範
10-2 已經很短,作者認為還不夠短,還是有過多的職責。
單一職責原則(Single Responsiblity Principle, SRP)
一個類別或模組應該只有一個修改的理由。
10-2 SuperDashboard有兩個修改的理由
追蹤版本訊息
管理元件
10-3 改寫成單一職責的類別
讓軟體能夠運作與讓軟體保持整潔是兩件不同的事情。寫程式都是先讓軟體能夠運作,再讓軟體保持整潔。
遵守單一職責原則會出現小型類別眾多的情況。
凝聚性
一個類別每個變數都被使用在每個方法中,類別就是具有最大的凝聚性。
凝聚性高代表類別裡的方法和變數是互相依賴。
10-4 是有凝聚性的類別。
保持凝聚性會得到許多小型的類別。
當類別喪失凝聚性的時候,將它們拆解開。
10-6 到 10-8 作者示範拆解 10-5 的程式。
拆解之後
程式變更長
可使用有註解效果的函數與類別名稱
用空白與編排技巧維持可讀性
為了變動而構思組織
10-9 範例是被改革的對象
10-10 範例是重構之後的結果,原有的sql類別拆成一組封閉的類別。建立一個抽象類別Sql,其他功能類別繼承Sql類別。
新增update功能只需要新增新的子類別UpdateSql類別,不用修改舊有的程式。
支持單一職責原則也支持開放-閉合原則(Open-Closes Principle, OCP)。
可新增UpdateSql功能所以有開放性。
不會影響舊有的程式所以有閉合性。
隔離修改
技巧類似圖8-2。作者想做到耦合最小化,讓程式遵守相依性反向原則(Dependency Inversion Principle,DIP)。類別應該要相依於抽象概念,而不是相依在具體細節上。
Portfolio類別不能直接使用TokyoStockExchange API,每分鐘會得到不同的結果會無法寫測試程式。
作者進行依賴反向新增StockExchange介面,由TokyoStockExchange類別實作StockExchange介面
有一個測試用FixedStockExchange類別實作StockExchange介面送出固定值,可完成測試程式。
留言
張貼留言