现代软件产业经过几十年的发展,一个软件由一个人单枪匹马完成,已经很少见了,软件都是在相互合作中完成的,合作的最小单位是两个人。两个工程师在一起,做的最多的事情就是“看代码”,每个人都能看“别人的代码”,发表意见。但是每个人对于什么是“好”的代码规范未必认同,这时,就需要知道“什么是好的代码规范和设计规范”。
代码规范可以分成两个部分。一、代码风格规范。主要是文字上的规定,看似表面文章,实际上非常重要。代码风格的原则是:简明,易读,无二义性。其中的内容包括:①缩进:一般不用Tab键,Tab键在不同的情况下会显示不同的长度,干扰阅读体验。4个空格的距离从可读性来说刚刚好。②行宽:行宽必须限制,如今可以限定为100字符。③括号:在复杂的条件表达式中,用括号清楚地表示逻辑优先级。④断行与空白的{}行:用明确的“{}”来判断程序的结构,在有多层控制嵌套时,可以看清结构和对应关系。⑤分行⑥命名:命名时尽量能让程序员一眼就能看出变量的类型,避免用错。⑦下划线:用来分割变量名字中的作用域标注和变量的语义。⑧大小写:用大小写可以区分由多个单词组成的变量名。⑨注释:注释是为了解释程序做什么,为什么这样做,以及要特别注意的地方。复杂的注释应该放在函数头,很多函数头的注释都用来解释参数的类型等,需注意的是,注释要随着程序的修改而不断更新,一个误导的注释往往比没有注释更糟糕,另外,注释(包括所有的源代码)应该只用ASCII字符,不要用中文或其他特殊字符,否则会极大地影响程序的可移植性。
代码规范中的第二部分就是代码设计规范,不光是程序书写的格式问题,而且牵扯到程序设计、模块之间的关系、设计模式等方方面面的通用原则。其中的内容有:①函数:关于函数最重要的原则是:只做一件事,并且要做好。②goto:函数最好有单一的出口,为了达到这一目的,可以使用goto,有助于程序逻辑的清晰体现。③错误处理:参数处理,对从外部(用户或别的模块)传递过来的参数,验证其正确性;断言,如多当你觉得某事肯定如何时就可以用断言。④关于类的处理:1.类:使用类来封装面向对象的概念和多态;避免传递类型实体的值,应该用指针传递;对于有显式的构造和析构函数的类,不要建立全局的实体;仅在必要时,才使用“类”。2.struct:如果只是数据的封装,用struct即可。3.成员类型:公共,保护,私有。4.数据成员:数据类型的成员用m_name说明;不要使用公共的数据成员,要用inline访问函数,可兼顾封装和效率。5.虚函数:使用虚函数来实现多态;如果一个类型要实现多态,在基类中的析构函数应该是虚函数。6.构造函数:构造函数不返还错误。7.析构函数:把所有的清理工作放在析构函数中。8.new和delete:尽量实现自己的new/delete,可以方便的加上自己的跟踪和管理机制;检查new的返回值,new不一定都成功;释放指针时不用检查null。9.运算符:运算符的实现必须非常有效率,如果有复杂的操作,应定义一个单独的函数。10.异常:异常是在“异乎寻常”的情况下出现的,它的设置和处理都要花费“异乎寻常”的开销,所以不要用异常作为罗技控制来处理程序的主要流程。11.类型继承:用const标注只读的参数;用const标注不改变数据的函数。
随着时代的进步,结对编程开始兴起,一对程序员肩并肩、平等的、互补地进行开发工作。结对编程让两个人所写的代码不断地处于“复审”的过程,程序员们能够不断地审核,提高设计和编码质量,可以及时发现并解决问题,避免把问题拖到后面的阶段去。结对编程的过程也是一个互相督促的过程,每个人的一举一动都在别人的视线之内,所有的想法都要受到对方的评价。这种督促的压力,使得程序员更认真的工作。结对编程“迫使”程序员必须频繁的交流,提高自己的技术能力。