我的做业Week2-代码复审

1、代码复审部分

1. 概要部分

代码能符合需求和规格说明么?git

代码基本符合需求和规格说明,可是在程序中有多余的Debug信息(sudoku.cpp中的176行)github

代码设计是否有周全的考虑?数据库

有必要的错误处理,可是还不太彻底,有错误检查没有覆盖的地方会引起程序异常。其余的设计还比较周全。编程

代码可读性如何?windows

可读性还能够,变量的命名有必定的意义。可是注释太少,而且由多个单词组成的函数/变量名并无进行大写区分使得并不容易快速明白函数/变量名所表达的意义。另外程序中空行过多,致使程序读起来并不太舒服。设计模式

代码容易维护么?数组

因为注释比较少,可读性并不太好,并不太容易进行维护。网络

代码的每一行都执行并检查过了吗?数据结构

检查过了。多线程

2. 设计规范部分

设计是否听从已知的设计模式或项目中经常使用的模式?

采用的是比较普通的业务逻辑以及解体思路,并无使用特定的模式进行设计编码。

有没有硬编码或字符串/数字等存在?

有比较多的硬编码数字。好比生成大量用的数独模板是硬编码的二维数组。

代码有没有依赖于某一平台,是否会影响未来的移植(如Win32到Win64)?

没有平台依赖,只要是windows均可以运行。

开发者新写的代码可否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在相似的功能能够调用而不用所有从新实现?

开发者新写的代码并不能用已有的功能实现。

有没有无用的代码能够清除?(不少人想保留尽量多的代码,由于之后可能会用上,这样致使程序文件中有不少注释掉的代码,这些代码均可以删除,由于源代码控制已经保存了原来的老代码。)

没有无用的代码能够消除,可是有一些冗余代码能够进行合并进行代码简化。

3. 代码规范部分

修改的部分符合代码标准和风格么(详细条文略)?

  • 函数名变量名若是由多个词拼成,应该大写首字母进行分割,便于快速理解含义。开发者的代码中(例如canin函数应该是canIn更符合规范)就没有遵循这点。

  • 多余的空行实在太多,有的连续几行都是空行,能够都删减掉。

  • 程序最开始的函数声明能够放到单独的头文件中,以增长程序的复用性以及可读性。

其他代码标准和风格都比较符合规范。

4. 具体代码部分

github的comment地址:https://github.com/zhj123169/bin/commit/967e00868b45d023dc934a4f388462fe519073a7

有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?

在程序中有对输入参数以及调用的外部函数的错误处理,并输出了错误信息。若是要求高一点的话,对于输入参数检查的错误处理的错误信息输出并不明确,之后能够进行错误信息的细化方便在运行时输出错误信息时能够快速定位出错误发生地点。可是在参数错误处理上仍是有些错误分支并无覆盖全(例如输入运行指令为 sudoku.exe -c,没有指定生成数独的数量,可是该状况会认为是正确的仍然想继续进行参数解析,会发生不可预知的错误行为)。

参数传递有无错误,字符串的长度是字节的长度仍是字符(多是单/双字节)的长度,是以0开始计数仍是以1开始计数?

参数传递没有错误,是以字符的长度做为字符串的长度,从1开始取出参数进行解析。

边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环?

数组大小基本为99的,也有9的,因为边界是定死的99的,因此正常的循环访问就能够确保不会越界。没有Switch语句。循环没有可能出现死循环。

有没有使用断言(Assert)来保证咱们认为不变的条件真的知足?

没有使用断言来保证不变的条件真的知足。

对资源的利用,是在哪里申请,在哪里释放的?有没有可能致使资源泄露(内存、文件、各类GUI资源、数据库访问的链接,等等)?有没有可能优化?

这个数独软件使用的资源为文件资源和内存资源。文件资源方面在进行读/写操做时进行申请,并在使用后及时进行了释放,没有文件资源泄露问题。

对内存资源的利用是在函数体内申请,但没有释放的地方,有很是严重的内存泄漏问题。具体的内存泄露问题是在大量调用的transform函数体内进行了内存申请,为每一个生成数独申请了内存申请,可是却将指针赋给了调用方的临时指针,致使了严重的内存泄漏,使得程序后来的内存回收也比较困难(虽然程序最后也没有释放内存)。

内存泄露的优化有两种,一种是在调用transform函数将原来的指针替换掉以前检查原来的指针是否为空,若是不为空则释放内存,再调用函数进行指针替换。

if(sudokuout!=NULL) free(sudokuout); // add to avoid memory leak
sudokuout = transform(oralline,oralsudoku);

或者在程序刚开始为每一个数独分配好内存空间,在程序最后进行统一的内存释放,而不是在函数中分配内存空间。

数据结构中是否有无用的元素?

如今的数据结构是简单的二维表,没有多余无用的元素。

5. 效能

代码的效能(Performance)如何?最坏的状况是怎样的?

如今代码的效能仍是比较差的。最坏状况下,也就是生成100w以及求解100w个数独时,耗时都大于420s。

代码中,特别是循环中是否有明显可优化的部分(C++中反复建立类,C#中string的操做是否能用StringBuilder 来优化)?

代码中有两处能够明显优化:

  • 在transform中反复调用了malloc函数,这个会致使内存泄露的同时也是不必的在循环内的反复申请内存空间。能够在程序刚开始就把全部数独的空间都申请到,最后再释放。
  • 判断一个数可否填入空白时,用循环遍历的方式来检查是否有重复是比较低效的,能够经过实时记录某行/列/块的某个数字是否填入(bool类型)来进行快速查重,这样能够每次最内层循环的至少27次比对操做就减小为最多3次比对操做,大大提升运行速度。

对于系统和网络调用是否会超时?如何处理?

并无系统调用和网络调用。

6. 可读性

代码可读性如何?有没有足够的注释?

可读性不太好,注释几乎没有,变量/函数名能够必定程度上说明功能,但仍是不太充分,须要更多的注释进行解释来增长可读性。另外过多的空行也影响了阅读体验。

7. 可测试性

代码是否须要更新或建立新的单元测试?

在github上的代码中没有上传单元测试,须要增长测试代码。

还能够有针对特定领域开发(如数据库、网页、多线程等)的核查表。

程序没有对特定领域的开发。

2、 设计代码规范

工具提供的代码规范和你我的的代码风格有什么不一样?

1. 不使用using来引入某个命名空间。
2. 变量的初始化和声明要放到一块。    
3. 每行末尾没有空格

工具提供的代码规范里有哪些部分是你以前没有想到的?

1. 不使用using来引入某个命名空间。
2. 变量的初始化和声明要放到一块。    
3. 每行末尾没有空格

为何要这样规范?这样的规范有意义吗?

这样规范代码能够保证较高的代码可读性,并减小本身或者多人合做致使的代码错误,提升了工做效率。例如上面的不使用using来引入某个命名空间能够有效避免命名空间中的某个函数与本身的某个函数产生了命名冲突致使的异常,等等。

最后附上咱们在结对编程时使用的代码规范:

(1)应该用4个空格代替tab
(2){应该和代码在同一行,而且中间有一个空格
(3)else,else if应该与if的}在同一行,且中间应当有一个空格
(4)注释的“//”和代码不能直接相连,中间应该有空格
(5)不可以使用using来引入某个命名空间
(6)每行的末尾不该该有空格
(7)应该有copyright
(8)代码的中间不该该有无关注释和无用空行
(9)函数结束后应该与下个函数间空一行
(10)过多的函数声明能够放到单独的.h头文件中
(11)变量名若是由多个单词组成,从第二个起第一个字母应当大写
(12)避免无用函数依旧在代码中出现。
(13)不要使用goto语句
(14)不要将多行代码放在同一行(好比多个变量声明)
(15)变量的声明必定要有初始值
(16)变量的初始化和声明要放到一块
相关文章
相关标签/搜索