iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
Software Development

消除你程式碼的臭味系列 第 5

Day 5- 簡潔性:程式碼是斯巴達式的

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250903/20124462P1N8QjGguI.png

消除你程式碼的臭味 Day 5 - 簡潔性:程式碼是斯巴達式的

如果程式碼需要超過 3 層縮排,就代表已經發臭了,應該去處理好你的程式碼。

深度縮排的程式碼,就是一個思想混亂的直接體現。
複雜的程式碼難以閱讀、太容易製造出 Bug。工程師的工作是解決問題,不是製造問題。

經典案例:縮排地獄

這不是程式碼,這是災難現場。

🔴 極度臭味:縮排地獄(超過 3 層)

https://ithelp.ithome.com.tw/upload/images/20250907/20124462eOKUqkJd3T.png

是不是很可怕。
很明顯寫的人在寫下第一行 if 的時候,根本沒想清楚他到底要幹嘛。
花了 90% 的沈重程式碼來處理各種例外,反而讓主要邏輯變得晦澀難懂。

🟢 斯巴達式簡潔(最多 2 層縮排) 不完美但好多了

與其深入迷宮,不如在入口處設立衛兵。這個模式的精髓是:儘早拒絕 (Reject Early)
就像夜店門口的保鑣,不符合資格?直接請你離開,根本不讓你進門。

function processUserData(userData) {
  // 衛兵 1: 用戶資料、個人檔案、偏好或通知設定不存在? -> 請回
  if (!userData?.profile?.preferences?.notifications) {
    console.log('User data is incomplete or notifications not configured.');
    return;
  }

  // 衛兵 2: Email 通知被關閉? -> 請回
  const notifications = userData.profile.preferences.notifications;
  if (!notifications.email) {
    console.log('Email notifications disabled.');
    return;
  }

  // --- 快樂路徑 ---
  // 恭喜!通過所有衛兵的檢查,接下來是暢行無阻的康莊大道。
  // 程式碼的主體清晰、線性,沒有任何縮排。
  const frequency = notifications.emailSettings?.frequency || 'default';
  sendEmailByFrequency(frequency);
}

// 輔助函式保持不變...
function sendEmailByFrequency(frequency) { ... }

重構後的版本:

  • 扁平化: 主幹邏輯是線性的,沒有深層的巢狀結構。
  • 處理邊界條件: 函式上半部處理「例外」,下半部專注於「主要邏輯」,焦點更清晰。
  • 可讀性高: 程式碼讀起來就像檢查清單,直接。

簡潔性的方法

衛兵模式 (Guard Clauses):提早返回(Early Return)

在函式開頭就把所有無效情況、錯誤條件、邊界情況全部處理掉,然後立刻 returnthrow
這能確保函式的主體部分,也就是 快樂路徑 happy path,完全不需要縮排。

可怕巢狀會有一堆分支

https://ithelp.ithome.com.tw/upload/images/20250907/201244622OPyIJMFoa.png

// 🔴 巢狀地獄條件判斷
function validateUser(user) {
    if (user) {
        if (user.name) {
            if (user.email) {
                if (user.age >= 18) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}

線性思路的衛兵模式

主邏輯現在是一條直線,而不是迷宮。
https://ithelp.ithome.com.tw/upload/images/20250907/20124462IL1KZ21oaP.png

// 🟢 清爽的衛兵 提早返回
function validateUser(user) {
    if (!user) return false;
    if (!user.name) return false;
    if (!user.email) return false;
    if (user.age < 18) return false;
    
    return true; // 快樂路徑
}

簡潔性檢查清單

  1. 縮排是否超過了兩層? (三層是警訊)

  2. 是否能用衛兵模式(提早返回)來簡化 if-else 結構?

  3. 函式的主要邏輯(快樂路徑)是否清晰且線性?

  4. 這個函式是否容易一眼看懂其執行流程?

今日重點

  • 超過三層縮排就是臭味程式碼。

  • 優先使用「衛兵模式」提早返回,避免巢狀 else

  • 讓你的函式主體只處理「快樂路徑」。

  • 簡潔的程式碼,讀起來應該像一篇簡單明瞭的說明文。

簡潔性不是目標,而是好設計的自然結果。

程式碼的清晰與否,就像一面鏡子,它誠實反映出你設計時的思路。
當鏡中的倒影混亂不堪時,你該整理的不是鏡子本身,而是背後的思緒。


上一篇
Day 4- 鐵律:向後相容性是神聖不可侵犯的
系列文
消除你程式碼的臭味5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言