前言
在开发过程中,我们经常会遇到大量的if-else语句,特别是在处理复杂的业务逻辑时。
虽然if-else语句是实现逻辑判断的一种有效手段,但是过多的嵌套会导致代码的可读性和可维护性变差,代码变得臃肿难以理解。
为了解决这个问题,我们需要采取一些优雅的方式去处理if-else的嵌套,使代码更加简洁、易于维护。
本文将会介绍几种常用的优化if-else的方法,包括函数式编程、多态、策略模式等。希望能对大家在开发过程中遇到的问题有所帮助。
优化方案
三元表达式
可以使用三元表达式(ternary operator)来替代简单的 if-else,例如:
const result = condition ? value1 : value2;
switch
当有多个分支需要判断时,可以使用 switch case 语句,例如:
switch (condition) {
case 'value1':
// do something
break;
case 'value2':
// do something else
break;
default:
// do default
}
函数隐射
可以将每个分支的逻辑封装到一个函数中,然后通过一个映射表来调用对应的函数
const actions = {
value1: () => {
// do something
},
value2: () => {
// do something else
},
};
actions[condition]();
策略模式
可以使用策略模式(strategy pattern)来封装每个分支的逻辑,并将它们作为对象传递给一个执行器,例如:
const strategies = {
value1: (args) => {
// do something
},
value2: (args) => {
// do something else
},
};
const execute = (strategy, args) => strategies[strategy](args);
execute(condition, args);
函数式编程优化
function getWelcomeMessage(accountType: string): string {
if (accountType === 'admin') {
return '欢迎管理员登录';
} else if (accountType === 'vip') {
return '欢迎尊贵的VIP用户登录';
} else {
return '欢迎普通用户登录';
}
}
type AccountType = 'admin' | 'vip' | 'normal';
const messages: Record<AccountType, string> = {
'admin': '欢迎管理员登录',
'vip': '欢迎尊贵的VIP用户登录',
'normal': '欢迎普通用户登录',
};
function getWelcomeMessage(accountType: AccountType): string {
return messages[accountType] || messages['normal'];
}
使用多态的方式优化
以下是个获取交通工具价格的demo,用if-else处理显然,很呆!
// 原始的 if else 代码
function getPrice(vehicleType: string, distance: number): number {
if (vehicleType === 'car') {
if (distance < 10) {
return 10;
} else {
return 10 + (distance - 10) * 0.5;
}
} else if (vehicleType === 'bike') {
if (distance < 5) {
return 5;
} else {
return 5 + (distance - 5) * 0.3;
}
} else if (vehicleType === 'bus') {
if (distance < 20) {
return 15;
} else {
return 15 + (distance - 20) * 0.4;
}
} else if (vehicleType === 'train') {
if (distance < 50) {
return 30;
} else {
return 30 + (distance - 50) * 0.2;
}
} else {
throw new Error('Invalid vehicle type');
}
}
这里我们可以将原本复杂的 if else 语句转化为代码逻辑更简洁、可读性更高的形式。
通过定义一个 Vehicle 接口,然后实现具体的子类 Car、Bike、Bus、Train,
每个子类实现自己的 getPrice 方法,
最后通过 getVehicle 方法来获取具体的子类实例,
再调用 getPrice 方法获取价格。
interface Vehicle {
getPrice(distance: number): number;
}
class Car implements Vehicle {
getPrice(distance: number): number {
if (distance < 10) {
return 10;
} else {
return 10 + (distance - 10) * 0.5;
}
}
}
class Bike implements Vehicle {
getPrice(distance: number): number {
if (distance < 5) {
return 5;
} else {
return 5 + (distance - 5) * 0.3;
}
}
}
class Bus implements Vehicle {
getPrice(distance: number): number {
if (distance < 20) {
return 15;
} else {
return 15 + (distance - 20) * 0.4;
}
}
}
class Train implements Vehicle {
getPrice(distance: number): number {
if (distance < 50) {
return 30;
} else {
return 30 + (distance - 50) * 0.2;
}
}
}
function getPrice(vehicleType: string, distance: number): number {
const vehicle: Vehicle = getVehicle(vehicleType);
return vehicle.getPrice(distance);
}
function getVehicle(vehicleType: string): Vehicle {
switch (vehicleType) {
case 'car':
return new Car();
case 'bike':
return new Bike();
case 'bus':
return new Bus();
case 'train':
return new Train();
default:
throw new Error('Invalid vehicle type');
}
}
这样可以让代码更易于扩展和维护,也更符合面向对象的设计思想。
结尾
在实际开发中,优化if-else的嵌套是非常重要的一件事情。我们需要尽可能地将代码写得简洁易懂,方便后续维护和修改。
希望本文对大家有所帮助,欢迎大家多多交流和分享!