一、代码复审Check List
1.概要部分
代码能符合需求和规格说明么?
代码符合需求和规格说明,对于正确的输入能返回正确的结果,对于不正确的输入也能输出相应的提示。
代码设计是否有周全的考虑?
考虑相对周全,对于参数个数不正确会输出"Too many or too few arguments!"。-c 模式下n的范围不正确会输出"Invalid -c number"。但是如果-s 后跟一个不存在的文件的名称的话不会提示错误信息。
代码可读性如何?
可读性良好,关键函数和变量都有注释,缩进也很到位。
代码容易维护么?
不是特别容易,代码没有采用面向对象的方式,没有将功能抽象成对象,使得代码耦合度不高,并且代码中有硬编码存在。
代码的每一行都执行并检查过了吗?
执行并检查了。
2.设计规范部分
设计是否遵从已知的设计模式或项目中常用的模式?
没有遵从已知的设计模式或项目中常用的模式而是想到哪写到哪。
有没有硬编码或字符串/数字等存在?
有硬编码。
代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)?
依赖windows。
开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
重新实现了字符串转成整型数字的算法,可以用atoi函数替代。
有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码。)
有,之前用freopen打开文件,后来改成了fopen时只是注释掉了freopen的代码,而freopen的代码是可以直接删除的。
3.代码规范部分
修改的部分符合代码标准和风格么(详细条文略)?
花括号格式不统一。
4.具体代码部分
有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
对错误进行了处理,检查了调用的外部函数的返回值。
参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
无错误,字符串长度是字节的长度,从0开始计数。
边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环?
矩阵的边界是0到8,没有Switch语句,不会死循环。
有没有使用断言(Assert)来保证我们认为不变的条件真的满足?
单元测试里用到了Assert,主程序中没有。
对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化?
在栈和静态存储区上申请和释放。程序打开文件后没有调用相应方法来关闭文件,有可能导致资源泄露。可以将所有输出暂时保存在一个字符数组中,在程序结束前一次性输出,可以提高程序的运行效率。
数据结构中是否有无用的元素?
没有无用元素。
5.效能
代码的效能(Performance)如何?最坏的情况是怎样的?
效能优异,生成100w个最终数独要4.717s,求解100w个数独要49.909s。
代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中string的操作是否能用StringBuilder 来优化)?
没有明显可优化部分。
对于系统和网络调用是否会超时?如何处理?
没有系统和网络调用。
6.可读性
代码可读性如何?有没有足够的注释?
总的来说还不错,但是没有采用面向对象的方法,没有将功能分别封装到不同的类中,所有的代码全都放在一个文件当中,对功能的划分不是很明确。一些注释掉的无用代码没有删除,有可能会影响到别人的阅读。
7.可测试性
代码是否需要更新或创建新的单元测试?
单元测试很到位,不需要更新或创建新的单元测试。
还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。
不需要。
二、设计一个代码规范
请根据你个人项目使用的语言,尝试使用其中的一款工具,回答以下问题:
工具提供的代码规范和你个人的代码风格有什么不同?
(1)没有copyright。
(2)tab应该替换成空格。
(3)"//"和注视内容之间要有一个空格。
(4)一个函数的'}'后要有一个空行。
(5)else要在'}'后,且之间要有一个空格。
(6)注释和代码间要有至少两个空格。
(7)'{'要和代码同一行,且隔一个空格。
(8)不能使用 using namespace std。
工具提供的代码规范里有哪些部分是你之前没有想到的?
(1)没有copyright。
(2)tab应该替换成空格。
(3)"//"和注视内容之间要有一个空格。
(4)一个函数的'}'后要有一个空行。
(5)else要在'}'后,且之间要有一个空格。
(6)注释和代码间要有至少两个空格。
(7)'{'要和代码同一行,且隔一个空格。
(8)不能使用 using namespace std。
为什么要这样规范?这样的规范有意义吗?
copyright可以表明代码的作者。
tab应该替换成空格是为了防止不同编译器打开代码时显示不一样。
不让使用using namespace std;是因为使用的话会增加名称冲突的可能性。
其余的规定是为了美观,增强可读性。
代码规范:
- 用4个空格代替tab。
- 开头需注明copyright。
- c的头文件要申明在c++的前面。
- 一行的字符不超过80。
- 赋值号的两端需要有空格。
- 注释和代码至少差两个空格。
- //和注释的内容之间要有一个空格。
- 行末不许出现多余空格。
- { 不能单独出现在一行,要跟着判断条件空的一个空格。
- 不许在判断后出现空行,所谓的Redundant blank line。
- 不要把多条语句放在一行。比如
if (a>b) return ;
要放在两行写。 - else需要出现在之前的if的}的同一行。
return;
return和;中不许有空格。- 不许用namespace,可以替换为
using std::cin;
等等。 - 类名/结构体名首字母大写。
- 变量名第一个单词首字母小写,其余单词首字母大写。
- 一行只能定义一个变量。
- 不能使用goto语句。