复审项目
15061122
https://github.com/Donemeb/SudukuProject
代码复审Check List
1. 概要部分
- 代码能符合需求和规格说明么?
基本的需求(生成和求解数独)都能满足,也符合规格说明;对于非法参数,也能输出错误提示。 - 代码设计是否有周全的考虑?
对于sudoku.exe -c N的命令,没有检测N的最大范围,而需求中已规定1<=N<=1000000。由于使用的strtoInt()方法,参数若为2147483648,就会转化成负数,不符合期望。 - 代码可读性如何?
总体来说不错,详见下面第6点。 - 代码容易维护么?
比较容易。 - 代码的每一行都执行并检查过了吗?
根据她的博客来看,功能函数部分是达到了100%覆盖的。
2. 设计规范部分
- 设计是否遵从已知的设计模式或项目中常用的模式?
由于一个类解决了所有问题,所以似乎没看出有什么模式。 - 有没有硬编码或字符串/数字等存在?
有。 - 代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)?
不依赖。 - 开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
重新实现了交换数组元素的swap(但这里我也重新实现了,因为发现比标准库的更快) - 有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码。)
有,上面已经说过。
3. 代码规范部分
- 修改的部分符合代码标准和风格么(详细条文略)?
命名、断行的风格始终如一。
4. 具体代码部分
- 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
有对错误进行处理,调用外部函数有返回值检查。 - 参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
无错误,字节的长度,从0开始计数。 - 边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环?
for边界条件处理正确,没有switch语句,不会死循环。 - 有没有使用断言(Assert)来保证我们认为不变的条件真的满足?
没有。 - 对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化?
文件打开得过早,可以在数据都计算完毕后在输出前才打开。 - 数据结构中是否有无用的元素?
没有。
5. 效能
- 代码的效能(Performance)如何?最坏的情况是怎样的?
效能不错,生成100万个终盘耗时3.891秒,解100万个数独耗时72.112秒。 - 代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中string的操作是否能用StringBuilder 来优化)?
没有。 - 对于系统和网络调用是否会超时?如何处理?
不会,未涉及到。
6. 可读性
- 代码可读性如何?有没有足够的注释?
注释写得不错,但存在以下问题。
7.可测试性
- 代码是否需要更新或创建新的单元测试?
类中有大量private函数,未进行单元测试。 - 还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。
本项目未涉及到。
设计一个代码规范
这里先使用cpplint 1.3.0对个人项目的代码进行检测
- 工具提供的代码规范和你个人的代码风格有什么不同?
cpplint采用的是Google C++代码规范,主要检测出了以下问题。
- 没有copyright信息
- 使用的是tab而不是whitespaces
- 行宽应小于等于80字符
- .cpp should include its header file(可我include了它的.h头文件啊? )
- 某行包含无效的Unicode字符(是不支持中文吗?)
- 工具提供的代码规范里有哪些部分是你之前没有想到的?
开头要有版权的注释。 - 为什么要这样规范?这样的规范有意义吗?
1.制表符应换为空格。这是为了统一不同编译器对TAB的解释,防止代码风格在不同编译器下不一致。这点在VS工具选项里文本编辑器将制表符改为插入4个空格就好了。
2.行宽小于80字符。由于老式终端每行最多显示80字符,因此有这个规定。但对于现在的设备,可以限制得长些。插件Editor Guidelines可在文本编辑器中加入提示线,帮助程序员注意行宽限制。
本组结对编程使用的代码规范
- 缩进
4个空格 - 行宽
100字符 - 断行
每个{和}都独占一行 - 命名
名字要体现其意义。
-
类/结构
每个单词首字母大写,如:SudokuSolver -
函数
使用“动词”或“动词+名词”的形式,第一个单词小写,其余单词首字母大写,如:generate(), setValue() -
变量
由作用域前缀+一个或多个单词组成,第一个单词小写,其余单词首字母大写(少数用途简单明了的局部变量可用i,j,x,y等表示)变量类型 例子 局部变量 temp, outFile 成员(member)变量 m_matrix 静态(static)变量 s_count 全局(global)变量 g_num