数独项目---代码复审

一、代码复审

1.概要部分

代码能符合需求和规格说明吗?
经过测试和代码的审阅,中间几次版本的代码有一些错误(像是输出格式不正确),最后一次版本功能大体正确,但是不能求解第1000000个数独。
代码设计是否有周全的考虑?
在生成数独的情况下,对两种参数均做了检查,但是在生成数独时读取数字的时候有可能发生溢出,在求解数独的时候没能判断文件路径是不是正确(文件是不是存在)。
代码可读性如何?
代码中有较少的硬编码(几乎没有),但是注释较少,碰到逻辑性比较强的部分不易看懂。
代码容易维护吗?
代码写的比较简短,逻辑不是特别复杂,容易维护。
代码的每一行都执行检查过了吗?
执行检查过了。

设计规范部分

设计是否遵从已知的设计模式或项目中的常用模式?
没有使用设计模式。
有没有硬编码或字符串/数字等存在?
代码中有少量的硬编码存在(十分少)。
代码有没有依赖于某一平台,是否会影响将来的移植?(如Win32到Win64)
未依赖平台。
开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
未找到这样的部分。
有没有无用的代码可以清除?
代码写的比较精简,但是存在一些无用的注释,建议删除。

代码规范部分

修改的部分符合代码标准和风格吗?
存在一些硬编码 :代码如下


其中的9和1000000可以用宏定义或者是定义为常量。
其他部分规范比较好。

具体代码部分

有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
对参数中的数字和文件路径没有进行检查。
参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
参数传递无错误,字符串的长度是一个字节的长度。是从零开始计数的。
边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环?
边界处理的无错误,没有使用switch语句,循环中没有死循环。
有没有使用断言(Assert)来保证我们认为不变的条件真的满足?
没有使用。
对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化?

如类声明所示,矩阵、文件缓冲区都在类中。不会导致资源泄露。这个类中没有什么优化的部分,但是在使用一些临时变量的时候,例如在循环的时候,建议放在循环外面。
数据结构中是否有无用的元素?
如上图所示,没有无用的元素。

效能

代码的效能(Performance)如何?最坏的情况是怎么样的?
在提交的一次代码中,文件输出的时候将字符一个一个输出到文件中,这种做法比较耗时。
github地址
因为两个功能用的都是回溯法,两种功能差别不大,性能还好。
代码中,特别是循环中是否有可明显优化的部分?
文件读写部分可以优化,找一些快速读写文件的方法(不用流输入输出),循环中的操作大部分比较简单。
对于系统和网络的调用是否会超时?如何处理?
没有这方面的调用。

可读性

代码可读性如何?有没有足够的注释?
代码还是比较容易看懂(有一两处功能操作不是很容易),注释很少(几乎没有),相应的地方增加注释比较好。

可测试性

代码是否需要更新或创建新的单元测试?
不需要。
还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。
无。

二、代码规范设计

使用的工具为cpplint

工具提供的代码规范和我个人的代码风格有什么不同?

在三个主要的文件中,下列错误比较多(按照出现次数多少进行排列)
1.Tab found; better to use spaces [whitespace/tab] [1]
在这次的项目中,缩进都是使用的tab而没有使用空格,可能造成不同软件打开之后缩进不同,影响代码可读性。
2.{ should almost always be at the end of the previous line [whitespace/braces] [4]
这个错误也是我没有想到的,因为平时写代码的时候经常将左大括号不放在单独的一行,这次没有考虑到。(原来vs的缺省支持将左大括号放在单独一行)
3.Missing space before { [whitespace/braces] [5]
这个选项最开始不知道。
4.Could not find a newline character at the end of the file. [whitespace/ending_newline] [5]
这个也是之前不知道的。
5.Line ends in whitespace. Consider deleting these extra spaces. [whitespace/end_of_line] [4]
有的行最后有多余的空格,以后应该注意。
6.Lines should be <= 80 characters long [whitespace/line_length] [2]
有的行用使用了一堆逻辑表达式,下次应该分行。
7.Copyright Message
这个是之前不知道也从来没有用过的。

工具中的代码规范里有哪些部分是我之前没想到的?

上述3,4,5,7是之前不知道的。

为什么要这样规范呢?这样规范有意义吗?

这样规范可以使代码能够让多个人共同工作的时候有较好的开发效率,当一个人拿到一份陌生代码的时候不用花太多的力气在搞懂前人的代码;另外如果是开源项目的话,其他人也能够较快的上手,融入到项目的开发中。
这样的规范肯定是有意义的。首先,能够让多人共同开发的时候有一个共同的 “语言”相互沟通;另外,这样的规范基本接近于一个通用的模板,不会让开发者觉得难看和难做(使用不同的平台也不会出现不兼容的结果)。

结对编程时的代码规范

1.缩进用tab(在两个人电脑上测试,没有出现缩进不齐的情况)
2.大括号{}单独占一行
3.逻辑符号前后的表达式加括号()
4.定义变量分行(一行只定义一个变量)
5.临时变量定义在最近使用的地方
6.所有的类/函数名所有单词的第一个字母都大写(Pascal);所有的变量第一个单词全部小写,后面同Pascal(Camel);
7.类的成员变量形式如下:m_xxx
8.类的声明形式如下:
public:
成员变量;
构造函数;
其他成员函数;
protected:
成员变量;
成员函数;
private:
成员变量;
成员函数;

同伴的github地址:
地址1
地址2
地址3
地址4
地址5

posted on 2017-10-03 18:17  AWwH  阅读(1155)  评论(0编辑  收藏  举报

导航