如何重构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
相关产品推荐
相关产品推荐

