《构建之法》学习(4)——两人合作
1.代码规范
做一个有商业价值的项目,或者在团队里工作,代码规范相当重要。
代码规范不仅能让同时期编程的合作同伴易理解,而且在后期他人作代码扩充时能节约时间,更好地完成项目。
1.1代码风格规范:简明,易读,无二义性
缩进:4个空格
行宽:100字符
括号:表示逻辑优先级
断行与空白的{}行:每个“{”和”}“都独占一行
分行:不把多条语句放在一行上
命名:“匈牙利命名法”
下划线:分隔变量名字中的作用域标注和变量的语义
大小写:所有的类型/类/函数名都用Pascal形式,所有的变量都有Camel形式
注释:解释程序做什么,为什么这样做,以及特别要注意的地方
1.2代码设计规范
函数:只做一件事,并且要做好
goto:函数最好有单一的出口,为了达到这个目的,可以使用goto
错误处理:参数处理
断言
如何处理C++中的类:类:避免传递类型实体的值,应该用指针传递。
对于有显式的构造和析构函数的类,不要建立全局的实体,因为你不知道它们在何时创建和消
除。
公共/保护/私有:按照这样的次序来说明类中的成员:public、protected、private。
数据成员:数据类型的成员用m_name说明。
不要使用公共数据成员,要用inline访问啊还念书,这样可以兼顾封装和效率。
虚函数:仅在很有必要的时候,才使用虚函数。
如果一个类型要实现多态,在基类中的析构函数应该是虚函数。
析构函数:把所有的清理工作都放在析构函数中。如果有些资源在析构函数之前就释放了,记住要
重置这些成员为0或NULL。
new和delete:如果可能,实现自己的new/delete,这样可以方便地加上自己的跟踪和管理机
制。自己 的new/delete可以包装系统提供的new/delete。
检查new的返回值。new不一定都成功。
释放指针时不用检查NULL。
运算符:当拿不定主意的时候,不要用运算符,用成员函数。
异常:使用异常时,需要注意在什么地方清理数据。
异常不能跨过DLL或进程的边界来传递信息,所以异常不是万能的。
类型继承:用const标注只读的参数(参数指向的数据是只读的,而不是参数本身)。
用const标注不改变数据的函数。
2.代码复审
看代码是否在“代码规范”的框架内正确地解决了问题。
目的
找出代码的错误
发现逻辑错误
发现算法错误
发现潜在的错误和回归性错误
发现可能需要改进的地方
教育开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识
代码复审的步骤
复审前
代码必须成功地编译,在所有要求的平台上,同时要编译Debug、Retail版本
程序员必须测试过代码
程序员必须提供新的代码,以及文件差异分析工具
简单来说,就是程序员要先做好一切准备
复审者有权在任何时候打断叙述,提出自己的意见
复审时
要把眼光放远,问一些更深层的问题:这样修改会影响其他功能吗?根本原因是什么?如何避免再次出现?
复审后
加入特定标记//$todo, $review, $bug
代码复审的核查表
概要部分
设计规范部分
代码规范部分
具体代码部分
效能
可读性
可测试性
3.结对编程
在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的那一位。这样,程序中的错误就会少得多,程序的初始质量会高很多,这样会省下很多以后修改、测试的时间。
同时,结对的两人可以互相督促,频繁交流,也可以避免代码的责任只属于某一个人,建立集体拥有代码的意识。
4.两人合作的不同阶段和技巧
萌芽阶段
磨合阶段
规范阶段
创造阶段
解体阶段
如何正确地给予反馈
最外层:行为和后果
中间层:习惯和动机
最内层:本质和固有属性