a, b, c, flag, tempif-else 超過 4 層,邏輯分支難追蹤| 反例 | 正例 | 說明 |
|---|---|---|
var a = getUser(); | const currentUser = getUser(); | 名詞表示實體 |
var flag = true; | const isUserActive = true; | 布爾值用 is/has/can 開頭 |
function f(x){} | function calculateTotalPrice(items){} | 動詞+名詞描述行為 |
const x = 86400000; | const MILLIS_PER_DAY = 24 * 60 * 60 * 1000; | 魔術數字常量化並自文檔 |
if (user) {
if (user.isActive) {
if (user.hasPermission) {
// 核心邏輯
} else { showError('無權限'); }
} else { showError('用戶未激活'); }
} else { showError('用戶不存在'); }
if (!user) return showError('用戶不存在');
if (!user.isActive) return showError('用戶未激活');
if (!user.hasPermission) return showError('無權限');
// 核心邏輯
doBusiness(user);
const handlers = {
'CREATE': handleCreate,
'UPDATE': handleUpdate,
'DELETE': handleDelete,
};
const handler = handlers[actionType] || handleDefault;
handler(payload);
if (!landCode) return '宗地代碼不足19位不能編制單元號!';
if (duplicate) return '已生成的不動產單元號不能重復編制!';
const ERROR_MESSAGES = {
UNCONFIRMED_DATA: '未確認數據不能編制單元號!',
INVALID_LAND_CODE: '宗地代碼不足19位不能編制單元號!',
DUPLICATE_UNIT: '已生成的不動產單元號不能重復編制!',
};
function validate(data) {
if (!data.confirmed) return ERROR_MESSAGES.UNCONFIRMED_DATA;
if (data.landCode.length < 19) return ERROR_MESSAGES.INVALID_LAND_CODE;
if (isDuplicate(data.unitNo)) return ERROR_MESSAGES.DUPLICATE_UNIT;
return null;
}
// 重構前: 50 行混雜邏輯
// 重構後:
class UnitNumberGenerator {
static validateInput(input) { /* 返回錯誤碼或 null */ }
static generate(landCode, owner) { /* 核心算法 */ }
static save(record) { /* 持久化 */ }
}
// 調用處極其清晰
const error = UnitNumberGenerator.validateInput(input);
if (error) return showError(ERROR_MESSAGES[error]);
const record = UnitNumberGenerator.generate(input.landCode, input.owner);
UnitNumberGenerator.save(record);
可讀性 = **命名自文檔** + **邏輯扁平化** + **配置集中化**。重構不僅為他人,更為 3 個月後的自己。