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

如何精简这段if-else代码以实现DRY原则?

符合DRY原则的代码重构方案

针对你这段房间移动的条件判断代码,最符合DRY原则且简洁易维护的方案是使用映射表(对象)存储所有移动规则,彻底替代冗余的if-else分支。以下是具体实现和分析:

重构后的代码

方案1:扁平化键值映射(最直观)

// 集中存储所有移动规则:[方向_当前房间ID] → 目标房间号
const roomMoveRules = {
  'east_1': '3',
  'east_4': '1',
  'west_1': '4',
  'west_3': '1',
  'north_5': '1',
  'north_1': '2',
  'south_1': '5',
  'south_2': '1'
};

// 生成查询键并获取结果,无匹配时可保留原房间号或自定义默认值
const queryKey = `${direction}_${player.currentRoom.id}`;
roomNum = roomMoveRules[queryKey] || roomNum;

方案2:按方向分组的嵌套映射(结构更清晰)

// 按方向分组存储规则,层级更明确
const roomMoveRules = {
  east: {
    1: '3',
    4: '1'
  },
  west: {
    1: '4',
    3: '1'
  },
  north: {
    5: '1',
    1: '2'
  },
  south: {
    1: '5',
    2: '1'
  }
};

// 使用可选链操作符安全查询,避免不存在方向时报错
roomNum = roomMoveRules[direction]?.[player.currentRoom.id] || roomNum;

为什么这是最优方案?

  • 彻底消除重复:所有移动规则集中在一个对象中,完全符合DRY原则,无需重复编写direction === X && player.currentRoom.id === Y这类条件。
  • 可读性极强:规则一目了然,新增/修改移动逻辑只需调整映射对象,不用改动核心判断代码。
  • 扩展性好:后续新增房间或方向规则,直接在映射表中添加键值对即可,无需新增else if分支。

对比你考虑的两种方案

  1. 嵌套条件判断:虽然能减少部分重复,但会产生多层嵌套结构,代码依然繁琐,维护成本高。
  2. 用||合并条件:会让单个条件表达式过长,逻辑分散,可读性差,且新增规则时会让条件越来越臃肿。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:30:53