如何精简这段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分支。
对比你考虑的两种方案
- 嵌套条件判断:虽然能减少部分重复,但会产生多层嵌套结构,代码依然繁琐,维护成本高。
- 用||合并条件:会让单个条件表达式过长,逻辑分散,可读性差,且新增规则时会让条件越来越臃肿。
内容的提问来源于stack exchange,提问作者kisaAlisa
相关产品推荐
相关产品推荐

