首页 > 技术文章 > 个人作业Week2-代码复审

yaoling1997 2017-10-01 19:40 原文

一、代码复审Check List

1.概要部分

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

代码符合需求和规格说明,对于正确的输入能返回正确的结果,对于不正确的输入也能输出相应的提示。

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

考虑相对周全,对于参数个数不正确会输出"Too many or too few arguments!"。-c 模式下n的范围不正确会输出"Invalid -c number"。但是如果-s 后跟一个不存在的文件的名称的话不会提示错误信息。

代码可读性如何?

可读性良好,关键函数和变量都有注释,缩进也很到位。

代码容易维护么?

不是特别容易,代码没有采用面向对象的方式,没有将功能抽象成对象,使得代码耦合度不高,并且代码中有硬编码存在。

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

执行并检查了。

2.设计规范部分

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

没有遵从已知的设计模式或项目中常用的模式而是想到哪写到哪。

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

有硬编码。

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

依赖windows。

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

重新实现了字符串转成整型数字的算法,可以用atoi函数替代。

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

有,之前用freopen打开文件,后来改成了fopen时只是注释掉了freopen的代码,而freopen的代码是可以直接删除的。

3.代码规范部分

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

花括号格式不统一。

4.具体代码部分

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

对错误进行了处理,检查了调用的外部函数的返回值。

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

无错误,字符串长度是字节的长度,从0开始计数。

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

矩阵的边界是0到8,没有Switch语句,不会死循环。

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

单元测试里用到了Assert,主程序中没有。

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

在栈和静态存储区上申请和释放。程序打开文件后没有调用相应方法来关闭文件,有可能导致资源泄露。可以将所有输出暂时保存在一个字符数组中,在程序结束前一次性输出,可以提高程序的运行效率。

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

没有无用元素。

5.效能

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

效能优异,生成100w个最终数独要4.717s,求解100w个数独要49.909s。

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

没有明显可优化部分。

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

没有系统和网络调用。

6.可读性

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

总的来说还不错,但是没有采用面向对象的方法,没有将功能分别封装到不同的类中,所有的代码全都放在一个文件当中,对功能的划分不是很明确。一些注释掉的无用代码没有删除,有可能会影响到别人的阅读。

7.可测试性

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

单元测试很到位,不需要更新或创建新的单元测试。

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

不需要。

二、设计一个代码规范

请根据你个人项目使用的语言,尝试使用其中的一款工具,回答以下问题:

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

(1)没有copyright。
(2)tab应该替换成空格。
(3)"//"和注视内容之间要有一个空格。
(4)一个函数的'}'后要有一个空行。
(5)else要在'}'后,且之间要有一个空格。
(6)注释和代码间要有至少两个空格。
(7)'{'要和代码同一行,且隔一个空格。
(8)不能使用 using namespace std。

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

(1)没有copyright。
(2)tab应该替换成空格。
(3)"//"和注视内容之间要有一个空格。
(4)一个函数的'}'后要有一个空行。
(5)else要在'}'后,且之间要有一个空格。
(6)注释和代码间要有至少两个空格。
(7)'{'要和代码同一行,且隔一个空格。
(8)不能使用 using namespace std。

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

copyright可以表明代码的作者。
tab应该替换成空格是为了防止不同编译器打开代码时显示不一样。
不让使用using namespace std;是因为使用的话会增加名称冲突的可能性。
其余的规定是为了美观,增强可读性。

代码规范:

  • 用4个空格代替tab。
  • 开头需注明copyright。
  • c的头文件要申明在c++的前面。
  • 一行的字符不超过80。
  • 赋值号的两端需要有空格。
  • 注释和代码至少差两个空格。
  • //和注释的内容之间要有一个空格。
  • 行末不许出现多余空格。
  • { 不能单独出现在一行,要跟着判断条件空的一个空格。
  • 不许在判断后出现空行,所谓的Redundant blank line。
  • 不要把多条语句放在一行。比如if (a>b) return ; 要放在两行写。
  • else需要出现在之前的if的}的同一行。
  • return; return和;中不许有空格。
  • 不许用namespace,可以替换为using std::cin;等等。
  • 类名/结构体名首字母大写。
  • 变量名第一个单词首字母小写,其余单词首字母大写。
  • 一行只能定义一个变量。
  • 不能使用goto语句。

推荐阅读