从冗长的 if-else 中解脱:几个优雅的处理方法

前言

在开发过程中,我们经常会遇到大量的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的嵌套是非常重要的一件事情。我们需要尽可能地将代码写得简洁易懂,方便后续维护和修改。

希望本文对大家有所帮助,欢迎大家多多交流和分享!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶张豪哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值