# 第七章 把控制流变得易读
# 条件语句中参数的顺序
// 好的写法:将变量放在左侧,常量放在右侧
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);
}
# 总结
控制流优化的关键原则:
- 保持条件语句简单直接
- 优先处理简单/正向情况
- 避免深层嵌套
- 合理使用提前返回
- 确保代码执行流程一目了然