如何简化嵌套if-else语句?多按钮音频播放代码优化咨询
代码简化方案
你的核心问题是重复逻辑冗余,8个按钮要写几乎一样的嵌套判断,我们可以通过「提取通用函数」+「条件组合生成音频标识」的方式解决,同时完全保留所有条件:
1. 抽离通用播放逻辑
所有按钮的播放逻辑本质上只有一个区别:对应音名不同(比如G、A、B等)。所以我们可以写一个通用的播放函数,把音名和各个条件作为参数传入,8个按钮直接调用这个函数即可。
2. 用条件组合替代嵌套if
把八度、升调、颤音这些条件拼成唯一的音频标识(比如high_sharp_vibrato_G),直接通过这个标识匹配对应的音频播放,不用一层层嵌套判断。
伪代码示例
第一步:编写通用播放函数
// 通用播放函数,参数为当前按钮的音名+所有控制条件 playNote(noteName, highOctave, midOctave, move, sharp, vibrato) { // 确定八度标识 let octave; if (highOctave) octave = "high"; else if (midOctave) octave = "mid"; else octave = "low"; // 确定播放模式:手机移动时循环,否则单次播放 let playMode = move ? "loop" : "once"; // 拼接音频后缀:仅移动状态下考虑颤音,非移动状态忽略颤音 let suffix = sharp ? "_sharp" : ""; if (move) { suffix += vibrato ? "_vibrato" : "_normal"; } // 拼出完整的音频唯一标识 let audioKey = `${octave}${suffix}_${noteName}`; // 播放对应音频 return AudioPlayer.play(audioKey, playMode); }
第二步:简化按钮监听代码
每个按钮的逻辑瞬间简洁,仅需传入对应的音名:
btn_G.onTouchListener(){ Case Motion.Action_Down: Gstream = playNote("G", high_octave, mid_oct, move, sharp, vibrato); Case Motion.Action_Up: Gstream.stop(); } btn_A.onTouchListener(){ Case Motion.Action_Down: Astream = playNote("A", high_octave, mid_oct, move, sharp, vibrato); Case Motion.Action_Up: Astream.stop(); } // 剩余6个按钮依此类推,仅修改noteName参数即可
3. 进阶优化:用哈希表存储音频资源
你之前考虑的哈希表可以这样落地:提前把所有音频资源按「音频标识」存入哈希表,播放时直接取值,效率更高:
// 提前初始化所有音频的映射表,仅需执行一次 const audioMap = { "high_sharp_vibrato_G": 高音升调颤音G音频, "high_sharp_normal_G": 高音升调普通G音频, "high_normal_vibrato_G": 高音普通颤音G音频, // ... 列出所有可能的音频组合 }; // 修改通用函数的播放逻辑 let targetAudio = audioMap[audioKey]; return targetAudio.play(playMode);
这种方式虽然初始化时需要列全所有音频组合,但后续维护仅需修改通用函数,无需改动8个按钮的代码,彻底解决重复问题,且时间复杂度仍为O(1),和原嵌套if效率一致甚至更高。
内容的提问来源于stack exchange,提问作者motty_here
相关产品推荐
相关产品推荐

