一. 代码复审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. 20145234黄斐《Java程序设计》实验五—网络安全与编程

    1: 两人一组结对编程: 0. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 1. 结对实现中缀表达式转后缀表达式的功能 MyBC.jav ...

  2. 3235: [Ahoi2013]好方的蛇

    3235: [Ahoi2013]好方的蛇 链接 分析: 可以求出以每个点为顶点的满足条件的矩形有多少个,单调栈求.设为sum. 然后对这个数组进行二维前缀和,可以求出每个矩阵内,以右下角.左下角为端点 ...

  3. 【BZOJ 2132】圈地计划 && 【7.22Test】计划

    两种版本的题面 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土 ...

  4. 基于Cocos2d-x-1.0.1的飞机大战游戏迁移到Cocos2d-x-3.0版本,并移植到Android平台成功运行

    一.版本迁移中的问题 1.游戏元素Sprite.Label.Action等等的创建函数名都改为create. 2.函数的回调callfunc_selectorcallfuncN_selectorcal ...

  5. 微信小程序中的 web-view 组件

    web-view 是一个可以承载 web 网页的容器,当 WXML 文件中存在 web-view 组件时,其他组件会自动全部失效,而且 web-view 承载的组件会自动铺满小程序的整个页面.其他组件 ...

  6. Codewars笔记

    说明:以下内容均来自codewars网站,列举的试题我都做过且通过,并以此记录来学习python.   1,需求:将大小写互相转换,非字母的字符保留 我的代码: def to_alternating_ ...

  7. jenkins使用时出现的问题!

      从安装到日常使用中遇到过的问题和解决方法:   背景/问题:安装时是跳过安装插件过程的,安装好后,我发现里面啥也做不了,连个git的插件都无法下载. 方法:在jenkins的主界面,打开系统管理= ...

  8. java练习(一)数组、集合的运用

    有这么一个有趣的问题,问:有这么一个不重复的自然数数组,自然数长度为N,而数组长度为N-2,依次随机把自然数放进数组中,请找出2个没有被放进去的自然数.例如:这个自然数数组是[0, 1, 2, 3,  ...

  9. mysql批量新增或者更新

    1.批量更新或者新增 1.单个新增或者更新 keyProperty新增完之后返回Id值

  10. 互评beta版本 - 探路者【贪吃蛇】

    基于NABCD评论,及改进建议 1)N(Need 需求) 开发本软件一方面是为了让80,90后用户重温童年的美好记忆,另一方面也是为了增加对英语学习兴趣较弱.意志力薄弱的中小学生学习英语的兴趣和动力, ...