如果程式碼需要超過 3 層縮排,就代表已經發臭了,應該去處理好你的程式碼。
深度縮排的程式碼,就是一個思想混亂的直接體現。
複雜的程式碼難以閱讀、太容易製造出 Bug。工程師的工作是解決問題,不是製造問題。
這不是程式碼,這是災難現場。
🔴 極度臭味:縮排地獄(超過 3 層)
是不是很可怕。
很明顯寫的人在寫下第一行 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) { ... }
重構後的版本:
在函式開頭就把所有無效情況、錯誤條件、邊界情況全部處理掉,然後立刻 return
或 throw
。
這能確保函式的主體部分,也就是 快樂路徑 happy path,完全不需要縮排。
// 🔴 巢狀地獄條件判斷
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;
}
}
主邏輯現在是一條直線,而不是迷宮。
// 🟢 清爽的衛兵 提早返回
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; // 快樂路徑
}
縮排是否超過了兩層? (三層是警訊)
是否能用衛兵模式(提早返回)來簡化 if-else
結構?
函式的主要邏輯(快樂路徑)是否清晰且線性?
這個函式是否容易一眼看懂其執行流程?
超過三層縮排就是臭味程式碼。
優先使用「衛兵模式」提早返回,避免巢狀 else
。
讓你的函式主體只處理「快樂路徑」。
簡潔的程式碼,讀起來應該像一篇簡單明瞭的說明文。
簡潔性不是目標,而是好設計的自然結果。
程式碼的清晰與否,就像一面鏡子,它誠實反映出你設計時的思路。
當鏡中的倒影混亂不堪時,你該整理的不是鏡子本身,而是背後的思緒。