Skip to content

如何减少项目里的 if-else

参考答案:

1. 多态与策略模式

适用场景:根据不同类型执行不同行为

typescript
// 优化前
if (user.role === 'admin') {
    showAdminPanel();
} else if (user.role === 'editor') {
    showEditorTools();
} else {
    showGuestView();
}

// 优化后
const roleHandlers = {
    admin: () => showAdminPanel(),
    editor: () => showEditorTools(),
    default: () => showGuestView()
};
roleHandlers[user.role]?.() || roleHandlers.default();

2. 查表法(Lookup Table)

适用场景:状态/错误码映射

javascript
// 优化前
if (status === 200) return 'Success';
if (status === 404) return 'Not Found';
if (status === 500) return 'Server Error';

// 优化后
const statusMap = {
    200: 'Success',
    404: 'Not Found',
    500: 'Server Error'
};
return statusMap[status] || 'Unknown';

3. 提前返回(Early Return)

适用场景:参数校验/前置条件检查

typescript
// 优化前
function process(data) {
    if (data) {
        if (data.valid) {
            // 主要逻辑...
            return result;
        } else {
            throw Error('Invalid data');
        }
    } else {
        throw Error('No data');
    }
}

// 优化后
function process(data) {
    if (!data) throw Error('No data');
    if (!data.valid) throw Error('Invalid data');
    
    // 主要逻辑...
    return result;
}

4. 责任链模式

适用场景:多条件顺序处理

javascript
// 处理器链
const validators = [
    { check: (input) => !input, error: 'Input required' },
    { check: (input) => input.length < 6, error: 'Too short' },
    { check: (input) => !/\d/.test(input), error: 'Need number' }
];

function validate(input) {
    const failure = validators.find(v => v.check(input));
    return failure ? failure.error : null;
}

5. 逻辑运算符简化

适用场景:简单条件赋值

javascript
// 优化前
let value;
if (input !== null) {
    value = input;
} else {
    value = defaultValue;
}

// 优化后
const value = input ?? defaultValue; // 或 input || defaultValue

6. 状态模式/状态机

适用场景:复杂状态流转

typescript
// 订单状态处理
class Order {
    state: OrderState = new PendingState();

    nextState() {
        this.state = this.state.next();
    }
}

interface OrderState {
    next(): OrderState;
}

class ShippedState implements OrderState {
    next() { return new DeliveredState(); }
}

7. 函数式编程

适用场景:条件数据转换

javascript
// 优化前
const results = data.map(item => {
    if (item.score > 90) return 'A';
    if (item.score > 80) return 'B';
    return 'C';
});

// 优化后
const gradeRules = [
    [score => score > 90, 'A'],
    [score => score > 80, 'B'],
    [() => true, 'C'] // 默认值
];

const getGrade = (score) => 
    gradeRules.find(([rule]) => rule(score))[1];

const results = data.map(item => getGrade(item.score));

8. 配置化规则

适用场景:动态业务规则

javascript
// rules.config.js
export const DISCOUNT_RULES = [
    { condition: user => user.isVIP, discount: 0.3 },
    { condition: order => order.total > 1000, discount: 0.2 },
    { condition: () => true, discount: 0 } // 默认
];

// 业务逻辑
function getDiscount(user, order) {
    const rule = DISCOUNT_RULES.find(r => r.condition(user, order));
    return rule.discount;
}