You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构Switch Case实现Hero类方法的动态调用?

优化动态动作调用:用映射表替代臃肿的Switch Case

这问题我太有共鸣了——随着英雄动作越来越多,switch case会变得像一团乱麻,每次加新动作都要改一堆代码,完全不符合开闭原则。咱们用对象映射表就能完美解决这个问题,让代码扩展性拉满!

核心思路

把整数类型的type和对应的Hero方法名做一个键值对映射,调用时直接通过type从映射表中取出方法名,再动态调用Hero的对应方法。这样新增动作时,只需要在映射表里加一行,完全不用碰调用逻辑的代码。

具体实现

第一步:定义动作映射表

先创建一个对象,把每个type对应的方法名字符串存进去:

// 映射表:key是type值,value是对应的Hero方法名
const actionTypeMap = {
  0: 'attack',
  1: 'defend',
  2: 'walk',
  3: 'run',
  4: 'fly',
  5: 'jump'
};

第二步:简化调用逻辑

用映射表替代switch case,同时加上容错处理(避免无效type导致报错):

const hero = new Hero();
let type = 1; // 来自数据库的动态参数
let result = null;

// 从映射表获取方法名
const targetMethod = actionTypeMap[type];

// 检查方法是否存在,避免调用undefined报错
if (targetMethod && typeof hero[targetMethod] === 'function') {
  result = hero[targetMethod]();
} else {
  // 处理无效type的情况,比如返回默认提示或执行兜底动作
  result = '无效的动作类型,请检查参数';
}

console.log(result);

进阶优化:把映射表封装到Hero类里

如果想让代码更内聚,可以把映射表作为Hero类的静态属性,这样所有和Hero相关的配置都集中在类里:

class Hero extends Player {
  // 静态映射表,和类的方法绑定在一起
  static actionTypeMap = {
    0: 'attack',
    1: 'defend',
    2: 'walk',
    3: 'run',
    4: 'fly',
    5: 'jump'
  };

  constructor(level = 1) {
    super();
    this.level = level;
  }

  attack() { return 'attacking'; }
  defend() { return 'defending'; }
  walk() { return 'walking'; }
  run() { return 'running'; }
  fly() { return 'flying'; }
  jump() { return 'jumping'; }
}

// 调用时直接从类的静态属性取映射表
const hero = new Hero();
let type = 1;
let result = null;

const targetMethod = Hero.actionTypeMap[type];
if (targetMethod && typeof hero[targetMethod] === 'function') {
  result = hero[targetMethod]();
} else {
  result = '无效的动作类型,请检查参数';
}

为什么这比Switch Case好?

  • 开闭原则友好:新增动作只需要在映射表里加一行,不用修改调用逻辑的代码
  • 可读性更强:映射表一目了然,能快速看到type和动作的对应关系
  • 容错更方便:统一处理无效type的情况,逻辑更集中

内容的提问来源于stack exchange,提问作者Vinicius Aquino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:27:26