• 个人作业Week2-代码复审


    一、代码复审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语句。
  • 相关阅读:
    node.js
    Ajax常见面试题
    CF932E Team Work
    斯特林数
    UOJ #62. 【UR #5】怎样跑得更快
    洛谷 P4593 【[TJOI2018]教科书般的亵渎】
    洛谷 P4321 【随机漫游】
    洛谷 P4707 【重返现世】
    洛谷 P3175 [HAOI2015]按位或
    CF Gym101933K King's Colors
  • 原文地址:https://www.cnblogs.com/yaoling1997/p/7617662.html
Copyright © 2020-2023  润新知