一. 代码复审Check List


1.概要部分


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

对-c的测试:

可以看到程序不支持1000000的数独终局输出,读源码发现常量MaxCounts定义为了100000,导致无法计算十万以上的数独终局。

另外,实际命令行运行发现程序无法自行停止,查源码发现最后的getchar()导致这一问题。

对-s的测试:发现输出的文件为空,不符合要求,交流后了解到是由于审题有错,导致读取文件时按用空格表示数独的空(而不是0)的格式读取,于是程序无法处理数字间有空格的正确格式文件。

相关issue:https://github.com/FelixCaae/SudokuGen/issues/1

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

见上一条,由于粗心的缘故导致出现了一些小问题,对于一些输入条件也有一些BUG,例如输入-c abc将会正常执行,不输出错误,当然这些问题后来都解决了。

代码可读性如何?

部分类及函数没有注释,读起来十分费劲,也有的函数添加了详尽的注释,能够让人容易读懂。整体采用面向对象的设计思路,函数功能简洁,故总体而言,代码可读性较好,但不算很出色,建议多加注释。

代码容易维护么?

代码充分体现了面向对象的思想,函数的长度都较短,换句话说修改代码时不需要做太多重构,应该较为容易维护。

代码的每一行都执行并检查过了吗?

存在clock计时和getchar这些冗余代码,Table.h中有Set函数的一个重载void Set(int num[][9]);没有定义和使用,其余代码均是必要的,且经执行都是正确的。

2.设计规范部分


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

没有设计模式,总体来说遵循面向对象的思路。

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

存储数独的二维数组使用int[9][9],其他没有。

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

依赖于windows,但是并不会影响win32到win64的移植。

开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?

没有,全部函数都无法用已知的调用功能实现。

有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码。)

没有注释掉的代码,至于冗余代码,见概要的最后一条。

3.代码规范部分


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

部分if后没有加大括号和换行,头文件没有添加头文件保护符,例如:

4.具体代码部分


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

对于文件的IO测试时,成功对不存在的文本文件101.txt进行了错误处理:

但是对于非法的生成数独规模参数却没有进行判断,例如下面这种输入依然生成了100个数独终局。

在对这个参数进行判断的时候进行了如下操作:

但并没有对sscanf_s的返回值进行处理判断写入成功与否,而是在外面包裹了try块,这样是不行的,因为sscanf不会主动抛出异常,实际上在输入abc时这个函数返回0,这是可以通过返回值判断的(当然输入100a的话仍然会写入100,需另行处理)。

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

经过检查,参数传递无错误,字符串的长度是字节的长度,从0开始计数。

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

文件的IO通过fgetc和feof的返回值进行判断,没有使用Switch语句,经过检查For循环的循环条件都是有限的,While循环都通过文件操作函数的返回值进行判断终止操作了,所以不会出现死循环。

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

没有使用。

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

在构造函数中申请的内存经检查均在析构函数中进行了释放,故不会出现内存泄漏,优化暂时来说不需要。

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

没有。

5.效能


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

在上面提到的BUG修复后,通过对其提交的Release版本的程序进行测试,测试量级为1000000,运行时间为8秒,由于他生成和求解数独所用的算法都是回溯递归,所以速度不快,但是这样的速度可以接受了。解数独较坏的情况是需要很多次的重复回溯,但是这样的话其实是难以避免的,因为很难判断从哪开始填能减少回溯次数。

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

没有,循环体都很精简,没有重复创建类之类的操作。

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

没有系统和网络调用。

6.可读性


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

整体来说代码可读性还OK,但是SdkBuffer和FileHandler的类函数建议加注释,因为初次阅读会很困惑,Table.h的函数虽然很乱(有4个函数重载),但加了注释勉强提高了理解速度。

7.可测试性


代码是否需要更新或创建新的单元测试?

不需要,多数类都进行过单元测试。

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

不需要。

二、设计一个代码规范


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

下载了cpplint对我的main函数所在cpp文件进行了测试,结果如下:

总结出来如下问题:

  1. 检测到tab,这是因为当初建项目时没有设置tab为4个空格,在写到一半的时候才设置,导致有一部分代码是没有转换过的。
  2. 数组长度为变量长度,这不是个错误,我的数组长度是定值,只不过其中使用了const常量,我想这是这个工具无法察觉的。
  3. 前半个大括号应该在前一句的结尾,这个我觉得都OK,换行可以更加清晰。
  4. 一行代码的长度应该小于等于80个字符。看了一下这是因为我那一行加了注释……
  5. //和注释之间应该加一个空格。好吧我接受,毕竟好看一点。
  6. else应该就写在}后面,这我不同意,看着乱,还是换行好。
  7. 加copyright,可以。
  8. 不要使用namespace。

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

我觉得copyright是一定没想到,但是它要求if和else一定写成:

if{

do sth;

}else{

do sth;

}

我没想到这一点,我觉得全部换行更好看也更加便于阅读,换句话说我觉得这样写是不好的。

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

这样的规范例如tab换成4个空格是方便在其他地方编辑查看,每个人都是用同样的代码规范可以便于协作和阅读,同时一些要求可以使得代码更易读。

根据构建之法书上编码规范里提到的那些要点整理一份在结对编程时使用的代码规范:

  1. 4个空格缩进;
  2. 每行字符长度不超过80;
  3. if语句写大括号,且所有大括号独占一行;
  4. 多条语句一定分行;
  5. 类型/类/函数名用Pascal形式,变量名用lowerCamel形式;
  6. 每个函数头部写注释表明注意事项和功能等;
  7. 类成员的声明先public后private,成员变量写最前面;

BUAA软工个人作业Week2-代码复审的更多相关文章

  1. 个人博客作业week2——代码复审

    1.代码规范 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 代码规范并不是从官僚制度下产生,它是为了提高项目团队开发效率而产生的一种工具,能够极大的增强代码可读 ...

  2. 个人作业 - Week2 - 代码复审

    代码复审Check List 概要部分 代码能符合需求和规格说明么? 能完成1~1000000个数独的求解与生成,并能处理异常输入,满足需求. 代码设计是否有周全的考虑? 为输入单独开设了一个输入检测 ...

  3. BUAA软工第一次作业-热身

    第一次作业-热身 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) (北京航空航天大学 - 计算机学院) 这个作业的要求在哪里 第一次作业-热身作业(阅读) 我在这个课程 ...

  4. 【BUAA 软工热身作业】继往开来,勇攀高峰

    项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:热身作业,阅读并撰写博客 作业要求 课程目标 学习大规模软件开发的技巧与方法,锻炼开发能力 作业目标 学习前辈经 ...

  5. BUAA软工个人作业Week3-案例分析

    一. 调研评测 评测项目:为了联系移动和PC版,我同时下载了必应词典的Android版本和UWP版本,选择UWP的原因是想看看微软推广的UWP在微软自己的应用上的效果.当然主要是对安卓的测评(UWP用 ...

  6. [BUAA软工]第二次博客作业---结对编程

    [BUAA软工]结对作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 2019年软件工程基础-结对项目作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能 ...

  7. [BUAA软工]第一次结对作业

    [BUAA软工]结对作业 本次作业所属课程: 2019BUAA软件工程 本次作业要求: 结对项目 我在本课程的目标: 熟悉结对合作,为团队合作打下基础 本次作业的帮助:理解一个c++ 项目的开发历程 ...

  8. [BUAA软工]第一次博客作业---阅读《构建之法》

    [BUAA软工]第一次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...

  9. [BUAA软工]第零次博客作业---问题回答

    [BUAA软工]第0次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第0次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...

随机推荐

  1. 【转载】COM 组件设计与应用(九)——IDispatch 接口 for VC6.0

    原文: http://vckbase.com/index.php/wv/1224.html 一.前言 终于写到了第九回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常 ...

  2. 14 [网络编程]-socket

    1.互联网协议 博客:http://www.cnblogs.com/linhaifeng/articles/6129246.html 2.socket层 Socket是应用层与TCP/IP协议族通信的 ...

  3. TMS320VC5509总线驱动LED灯

    1. 重新建立的工程,需要添加宏定义才行 CHIP_5509 2. 驱动LED用的是74LVC573锁存器,LE高电平时,Q1=D0,LE低电平时,Q1=之前的状态,下面是数据总线 看下地址总线 看下 ...

  4. Kali2.0可用国内源更新sources.list

    vim /etc/apt/sources.list #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contri ...

  5. 指定路由器(DR/BDR)和非指定路由器(DROTHER)的区别

    一:名词解释 DR:designated router 指定路由器. BDR:backup designated router 备份指定路由器. 二:DR/BDR出现的缘由 在广播网和NBMA网络中, ...

  6. 关于摄像头PCB图设计经验谈

    摄像头PCB设计,因为客观原因等.容易引起干扰这是个涉及面大的问题.我们抛开其它因素,仅仅就PCB设计环节来说,分享以下几点心得,供参考交流: 1.合理布置电源滤波/退耦电容:一般在原理图中仅画出若干 ...

  7. TPO-22 C2 Revise a music history paper

    第 1 段 1.Listen to part of a conversation between a student and his music history professor. :听一段学生和音 ...

  8. 关于kafka的一些问题理解

  9. 【CentOS 7】nginx配置web服务器

    1,安装过程 [root@VM_1_14_centos ~]# cd /data/ [root@VM_1_14_centos data]# wget http://nginx.org/download ...

  10. JavaWeb-Servlet-Tomcat

    Servlet就是运行在服务器上的Java类.Servlet容器为javaweb应用提供运行时环境,负责管理Servlet和JSP的生命周期,以及管理它们的共享数据. Servlet容器软件——Tom ...