看完了《编写可维护的JavaScript》,觉得他技巧性的东西讲得太少,还不如看《重构》来得实在。这里分享两个我常用的优化代码的技巧,好学常用。范例代码用的是JavaScript,其实几乎所有语言都用的到。
逻辑扁平化
我们工作中,可能会碰到一些比较复杂的逻辑,比如:满足条件1,不然XX;满足条件2,不然XX……如此都满足了才OO,写出来大概是这样:
if (condition1) { if (condition2) { if (condition3) { // do // a // lot } else { // do zz } } else { // do oo } } else { // do xx }
这样带来的结果就是逻辑嵌套后显得很复杂,不好读。如果再赶上缩进没搞好或者换行就更惨了。这个时候,通常可以提前中断代码执行来使得逻辑扁平化。提前中断的方法包括return
、throw
,以及PHP中的die()
和exit()
。重新整理后的代码如下:
if (!condition1) { // do xx return; } if (!condition2) { // do oo return; } if (!condition3) { // do zz return; } // do // a // lot
当然,有例外情况要排除的地方也很适用这种方法。甚至有激进的言论,表示不应该使用else
,而都要这样提前中断。我觉得那样也有点过分,if ... else ...
的意义还是非常明确的。
缩短超长逻辑判断
有个从上古时期传下的不成文的规定,一行代码80个字符。随着显示器变大,这个老规矩应该打破。但是单行代码太长的话左右看起来也会很累,所以我们还是有必要控制。超长的代码经常出现在逻辑判断里,比如游戏中常见的检测子弹有没有打中玩家的代码,用较好的格式写出来大概是这样:
if (bullet.x > enemy.x + enemy.width || bullet.y > enemy.y + enemy.height || bullet.x + bullet.width < enemy.x || bullet.y + bullet.width < enemy.y) { console.log('没打中'); }
这就已经不短了。有些时候我们还要加上enemy.damagable、!enemy.immunePhysical之类的其它条件判断,把这一行写的特别长。这个时候就需要我们用点小技巧将它缩短了。方法可能有多种,思路是一致的,就是提炼“目的”——将某一组判断的目的提炼成一个变量,既好读又能缩短代码。接下来还是用一段代码来说明吧:
var isGod = !enemy.damagable || eneymy.immunePhysical, // 判断敌人是否不能攻击/上帝模式 isHit = bullet.hitTest(eneymy); // 将刚才那一大串抽出方法“碰撞检测” if (!isGod && isHit) { enemy.die(); }
总结
这两个小技巧都很简单,但对代码的可读性提高却很显著。各种各种的小技巧叠加起来,会让代码更好读,更容易维护。
欢迎吐槽,共同进步