Ch14: 總結
本書的旅程
Ch1, Ch2:動機
- 重構的目標:將不變條件區域化減少脆弱;減少耦合增加靈活性
Ch3 ~ Ch6:具體化
- 一個貫穿的重構範例
- 具體的規則,及執行的細節
Ch7 ~ Ch13:拓寬視野
- 提升抽象層次
- 善用工具
- 更多的重構技巧
基本原則
- 尋找「最小」的步驟進行重構
- 從可執行的狀態,轉移到另一個可執行狀態
- 降低錯誤的風險
- 容易在重構過程中改變方向
- 重構的技能是需要培養、練習、習慣的
- 有些高級技巧需要你純熟基礎技巧後,才能掌握的
- 尋找底層結構
- 黏土雕塑家,從一塊黏土開始,慢慢塑造出結構與外觀
- 「每塊石頭裡都有一尊雕像,雕塑家的任務是發現它」- 米開朗基羅
- 「繪畫創作是逐步改進產生。由素描開始,然後填入細節。但並不是一個填入的過程,而是在過程中不斷調整。這與程式開發的過程十分相像」- 駭客與畫家
用規則進行實作
- 本書提供的是一個良好的出發點,能夠引發重構的必要性與行動
- 「規則」只是工具,而不是「定律」
- 不要盲目地套用規則
團隊優先於個人
- 「如果你想走得快,就單獨行動;如果你想走得遠,就攜手前進」- 非洲諺語
- 整個團隊都該對code repo負責,並承擔責任
- 我們希望能快速有信心的修改程式碼,任何會阻擋這個目標的問題都需要被解決
簡單化優先於完整性 - 制定規則的設計原則
- 如果看到糟糕的程式碼或問題,想要建立「規則」來禁止時,很容易陷入「泛化」的陷阱
- 規則都有其適用的「情境」
- 必須易於套用,而不是設計一個「萬用的規則」可以套用在很多情境上
- 「簡單但錯誤」優先於「複雜但正確」
使用物件或高階函式
- 本書避免了很多高階函式的用法,例如閉包(Closure)只是為了保持風格一致
- 但實際上只要讀起來容易,一樣可以使用
Class Implement
class Moo {
constructor(name) {
this.name = name;
}
foo(word) {
console.log(this.name, "say", word)
}
}
var moo = new Moo('Mohoho');
moo.foo('hi');
// Mohoho say hi
Function Implement
function Moo(name) {
this.name = name;
this.foo = function(word) {
console.log(this.name, "say", word);
};
}
var moo = new Moo('Mohoho');
moo.foo('hi');
// Mohoho say hi
旅程的繼續
微觀架構
- Clean Code - Robert C. Martin
- Refactoring - Martin Fowler
宏觀架構
- Test-Driven Development - Kent Beck
- Types and Programming Language - Benjamin C.Pierce
- Type-Driven Development with Idris - Edwin Brady