分类
技术

也谈提升代码可读性的小技巧

看完了《编写可维护的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
}

这样带来的结果就是逻辑嵌套后显得很复杂,不好读。如果再赶上缩进没搞好或者换行就更惨了。这个时候,通常可以提前中断代码执行来使得逻辑扁平化。提前中断的方法包括returnthrow,以及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();
}

总结

这两个小技巧都很简单,但对代码的可读性提高却很显著。各种各种的小技巧叠加起来,会让代码更好读,更容易维护。

分类
技术

书评:《编写可维护的JavaScript》

编写可维护的JavaScript
书的封面

评价:

3星。如果手头宽裕,或者公司给买就买本看看。如果觉得自己水平欠佳,也推荐学习下。不然就算了。

其中内容3.5,编辑2.5,综合起来就是3星了。

适合人群:

  • 缺少规范编程训练的开发者,比如学生
  • 对整个开发环境缺乏了解的新人

读后感

很早就关注这本书,当时还只有英文版,前几日看到中文版上线,又是淘宝几个人译的,就赶紧买了,结果看后大失所望。

最让我失望的是书里印刷错误很多,甚至连!=都能印成!==(第50页),估计道行浅的看到这儿就迷茫了。全书我看得比较细的是前面8章,几乎每章都有错误,实在让人如鲠在喉。

整书的内容偏浅,讨论的多是差不多的几种方案选择其一,比如空格缩进、4空格2空格、注释要不要有空行之类。其实这种东西绝大多数语言都会涉及到,也没什么好坏之分,团队领导随便选一个就是了。真正对代码质量有较大帮助的是命名空间(第6章)、UI层解耦(第5章)、事件和逻辑接偶(第7章)。读完这几章本以为书会渐入佳境,结果后面都是很浅显的否定浏览器推断的做法,以及介绍使用Ant进行编译,就没什么意思了。

在我看来,有些内容是不用多说的,比如用浏览器推断某种方法是否存在,提一嘴就行了;有些内容则是初段码农和高阶程序员的分水岭,这才值得大书特书。比如,复杂逻辑的扁平化处理、超长条件分拣成更易读的名字、模式的应用、大型项目的架构、消息机制,等等。可惜这些书里都没有提。至于Ant的介绍,至少我这种半路出家的非Java开发者并不熟悉,倒是直接node.js+grunt用起来挺顺手,而且每家公司的工具使用状况也不一样,是否直接写好几章真的有待商榷。

我认为,如果自我感觉缺乏系统可靠的编程培训,可以看看这本书。如果想真正提高自己的代码质量,这本书价值不高。