# 第七章 把控制流变得易读

# 条件语句中参数的顺序

// 好的写法:将变量放在左侧,常量放在右侧
if (user.age >= 18) {
  // 成年人逻辑
}

// 不好的写法
if (18 <= user.age) {
  // 不易读
}

# if/else 语句块的顺序

// 优先处理简单/正向的情况
function processUser(user: User) {
  if (!user.isActive) {
    return false;
  }
  
  // 处理活跃用户
  // ... existing code ...
}

# 三目运算符

// 简单的条件判断可以使用
const status = isLoggedIn ? 'active' : 'inactive';

// 复杂的逻辑应该避免使用
// 不好的例子:
const message = isAdmin ? 
  (hasPermission ? 'admin' : 'restricted') : 
  'guest';

# 避免 do/while 循环

// 使用 while 替代 do/while 更清晰
let attempts = 0;
while (attempts < MAX_ATTEMPTS && !isSuccessful) {
  // ... existing code ...
  attempts++;
}

# 从函数中提前返回

function processOrder(order: Order) {
  if (!order.isValid) return false;
  if (order.isCancelled) return false;
  
  // 处理有效订单
  // ... existing code ...
}

# 臭名昭著的goto

// 使用goto的示例(通常应该避免)
void process() {
    if (condition1) {
        goto step1;
    }
    goto step2;

step1:
    // 步骤1的代码
    return;

step2:
    // 步骤2的代码
    return;
}
// 更好的替代方案(使用函数和return)
void betterProcess() {
    if (condition1) {
        step1();
        return;
    }
    step2();
}

# 最小化嵌套

// 不好的深层嵌套
function badExample() {
  if (condition1) {
    if (condition2) {
      if (condition3) {
        // ... existing code ...
      }
    }
  }
}

// 好的扁平化结构
function goodExample() {
  if (!condition1) return;
  if (!condition2) return;
  if (!condition3) return;
  
  // ... existing code ...
}

# 你能理解执行的流程吗

// 清晰的流程控制示例
function calculateDiscount(user: User, order: Order) {
  // 1. 验证输入
  if (!user || !order) throw new Error('Invalid input');
  
  // 2. 检查资格
  if (!user.isEligibleForDiscount) return 0;
  
  // 3. 计算折扣
  let discount = BASE_DISCOUNT;
  if (order.total > 100) discount += 0.1;
  if (user.isVIP) discount += 0.05;
  
  return Math.min(discount, MAX_DISCOUNT);
}

# 总结

控制流优化的关键原则:

  1. 保持条件语句简单直接
  2. 优先处理简单/正向情况
  3. 避免深层嵌套
  4. 合理使用提前返回
  5. 确保代码执行流程一目了然