ARTS - Share 补2019.1.23

再谈代码规范

为什么要有规范

代码是方便给人读的,机器码是方便给机器读的

探本溯源来看代码这个问题。为什么会出现不同的编程语言?为什么不直接使用机器码0,1或汇编来进行编程?为什么进化出了一大堆语言,比如适合做系统开发的C,面向对象的C++、Java, 浏览器方面的JavaScript ?我们多问几遍为什么,就离答案不远了,—— 为了方便我们人类工作。

并非人人都是冯诺依曼

冯诺依曼是个天才,当我们在争论"PHP是最好的语言"时候,人家认为的最好的语言是汇编,因为汇编可以做到一切。我们软件、互联网行业并非人人都是开宗立派级的大师,还有很多水平一般的从业者,他们的目的并非是研究一门性能卓越的语言或开拓一个技术新领域,而是使用现有的技术手段完成任务。 相信大多数人都是这样,基于这个目的,我们需要的就是一个 人类逻辑习惯与计算机性能之间平衡最好的语言。于是就出现了各种编程语言,慢慢形成了各自的适应领域。

合作编程

说了这么多,其实就是为了说明我们为了一个完成一个目的而编程,大多数人都是互相合作配合来完成这个任务,也就是合作编程。这时候我们的代码就需要可读性了。可读性是个很重要的指标,有人戏说,别人读你代码骂的次数和你代码质量成反比。这就一定程度反映了代码可读性问题。所以写出正确、可读、优雅的代码就是一个很重要的能力。巧合的是,简单优雅的代码往往性能表现也突出,所以,我们追求优雅的代码就成了一个正确的方向。注明的KISS(Keep It Sample Stupid)原则就是反映这一点。

编程规范

所以规范就出来,目的就是为了保证可读性与性能,比如:

  • 命名规范。命名太重要的,好的名字见名知意,为什么需要写注释?因为名字不好。

  • 避免设计臃肿的代码。一个方法最好能一个屏幕读完,简单明了,多了说明你需要重构了。

  • 避免在for循环里操作数据库,最好提出来批处理。

  • if/else ,如果else逻辑简短但if繁多,就把 else 内容提前面。比如在循环里这种应该直接把 else 提前面

    // 反例
    for (xxx) {
      if (abc) {
        1. ...
        2. ...
        3. ...
          ...
      } else {
        continue;
      }
    
    }
    
    // 正例
    for (xxx) {
      if (!abc) {
        continue;
      } 
      1. ...
      2. ...
      3. ...
        ...
    
    }
    
  • 变量名尽量不重复。避免在多次使用到的变量来回改值,这样不方便追踪。

  • // 反例
    int count = db.findCount();
    if (a > count) {
    	count = a - count - x;
    
    	if (count >0) {
    		b = b + count;
    	}
    }
    
    // 正例
    int count = db.findCount();
    if (a > count) {
    	int num = a - count - x;
    
    	if (num >0) {
    		b = b + num;
    	}
    }
    
  • 代码格式化。这条很简单,很多编辑器都带自动排版的功能,但是仍然大量存在没有格式化的代码。

更多关于规范的请参考这篇文章程序员修养

面向xx编程

最近和小伙伴讨论了一个话题,如何写出优质的代码。有人提出TDD,测试驱动开发,直接先开发测试代码,再为满足测试写业务代码,这样能避免很多低级问题。有人提出代码审查机制,避免提交不规范的代码。更有人提出,面向离职编程,也就是说把你当前工作当做去赴下一个翻倍薪资的工作离职前的交接,把各种文档、代码注释写的清清楚楚,坚持一段时间后你会发现,你的代码可读性上了一个大台阶。