小函式,只做一件事 (Do One Thing)

★★★★★Draft

FromClean CodeCode Complete

📚 From the Books

小函式,只做一件事 (Do One Thing)Functions

函式的第一守則是短小,第二守則是更短小。但「短」只是表象,真正的判準是只做一件事、把它做好、而且只做這件事。一個函式若能被拆成「初始化區、處理區、收尾區」這種段落,它就已經做了不只一件事。

🧠 Why It Matters

NOTE

內聚性的理想是功能內聚——sin()getCustomerName()eraseFile() 各只做一件事。要警惕的是邏輯內聚(塞進多個不相關操作、靠傳旗標選一個執行)與巧合內聚(操作之間毫無關聯),這兩者是重新設計的訊號。

⚖️ Case Study

前 — 一個函式身兼三職
// 同時算總和、找極值、算平均:三件事、三個變化理由
function processScores(scores) {
  let total = 0;
  let min = Infinity;
  let max = -Infinity;
  for (const s of scores) {
    total += s;
    if (s < min) min = s;
    if (s > max) max = s;
  }
  return { average: total / scores.length, min, max };
}

想改「平均的算法」得讀懂極值邏輯,想改「極值」得繞過總和——三件事糾纏在同一個迴圈裡。

後 — 各司其職,主流程讀起來像摘要
function average(scores) {
  return scores.reduce((sum, s) => sum + s, 0) / scores.length;
}
function minScore(scores) {
  return Math.min(...scores);
}
function maxScore(scores) {
  return Math.max(...scores);
}

// 使用端讀起來像目錄,每個名字是一次「要不要深入」的選擇
const stats = {
  average: average(scores),
  min: minScore(scores),
  max: maxScore(scores),
};

每個函式只有一個變化理由;改任一個都不會波及其他。這正是 Extract Function 把「意圖」與「實作」分層的結果。

TIP

別因為「只有兩三行」就不肯抽子程式。小操作往往會長大——日後要加錯誤處理或邊界檢查時,集中在一處只改一次,散在十幾處就得改十幾次。一行 points = deviceUnitsToPoints(deviceUnits) 也比展開的公式好讀。

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading