likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 18

前言

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

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