一、代码复审

概要部分

  • 代码能符合需求和规格说明么?
    能;
  • 代码设计是否有周全的考虑?
    有较为周全的考虑;
  • 代码可读性如何?
    可读性一般;
  • 代码容易维护么?
    不太容易维护;
  • 代码的每一行都执行并检查过了么?
    是的;

设计规范部分

  • 设计是否遵从已知的设计模式或项目中的常用模式?
    没有采用设计模式,但是类的成员变量都声明成了public,建议改成private;
  • 有没有硬编码或字符串/数字等存在?
    存在较多的硬编码;
  • 代码有没有依赖于某一平台,是否会影响将来的移植?(如Win32到Win64)
    没有;
  • 开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
    存在;
  • 有没有无用的代码可以清除?
    有部分注释掉的代码可以清除,且有一些函数的功能重复;

代码规范部分

  • 修改的部分符合代码标准和风格么?
    1.大括号应单独占一行;
    2.变量和函数的命名也有一定的问题,需要改进;
    3.有部分地方忘了缩进;

具体代码部分

  • 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
    处理了命令行参数的大部分错误,但没有对输入文件中的数独题目的正确性进行检查(比如读到一个'0'-'9'之外的字符);对于调用的外函数,检查了返回值但没有处理异常;
  • 参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
    无错误;字符的长度;没有统一以0或1开始计数,两种都有;
  • 边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环?
    边界条件处理的没有问题;没有Switch语句;不会出现死循环;
  • 有没有使用断言(Assert)来保证我们认为不变的条件真的满足?
    没有;
  • 对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化?
    只涉及到文件的打开和关闭,在验证了命令行参数正确以后就将文件打开但最后没有关闭文件;我认为可以优化的地方是在这个代码中每次向文件输出时都要重新申请一个数组并初始化,我建议可以将这个数组声明为类的私有成员变量并且在构造函数中完成初始化,可以提高效率;
  • 数据结构中是否有无用的元素?
    无;

效能

  • 代码的效能(Performance)如何?最坏的情况是怎么样的?
    不错,对于-c参数效能挺高,但是对于-s参数不高(原因是-s时采用了回溯法且读入文件时是每次读入一个字符);最坏的情况是读入100,0000个数独题目求解后输入到文件;
  • 代码中,特别是循环中是否有可明显优化的部分?
    IO部分可以略作优化,主要是读入文件时可以一行一行读;另外就是之前说的不用每次输出时都重新定义一个数组并做初始化,而是将这个数组声明为类的私有成员变量;
  • 对于系统和网络的调用是否会超时?如何处理?
    没有这方面的调用;

可读性

  • 代码可读性如何?有没有足够的注释?
    代码可读性一般;没有足够的注释,但是由于算法不是很难,稍微想一想也可以读懂;

可测试性

  • 代码是否需要更新或创建新的单元测试?
    暂时不需要;
  • 还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。
    无;

Github传送门

Comment1
Comment2
Comment3
Comment4

二、代码规范设计

Cpplint使用

  • 工具提供的代码规范和我个人的代码风格有什么不同?
    1.Cpplint要求有copyright message但是我没有(之前也没有这个习惯);
    2.Cpplint要求代码和注释之间至少有两个空格的空间,但是我都是看心情打空格;
    3.Cpplint要求#include头文件时文件名前要加上目录,但是由于我文件都在一个目录下因此也没加;
    4.Cpplint要求一行不能超过80个字符,但我之前都是随便写的,一般一行写完一个完整的逻辑表达式;
    5.Cpplint要求对于一个const类型的字符串应该采用C风格的字符串,我直接使用的s是C++的string类型;
    6.Cpplint要求'{'应该出现在前一行代码的行末,我以前也一直是这样写的,但是看了《构建之法》后改成了将其单独放在一行,并且VS2017也支持的是这样的风格;
    7.Cpplint要求缩进最好用空格,但我之前一直使用的是tab;
    8.Cpplint要求声明长整型变量时用int64,但我用的是C语言中的long;
    9.Cpplint要求else应该出现在‘}’的同一行,但我的else都是另起一行;
    10.Cpplint要求‘//’和注释之间有一个空格,但是我之前都是看心情打空格;
    11.Cpplint要求在文件的末尾有一个换行符,但是我之前也都是看心情;
    12.Cpplint要求声明类的成员时public/protected/private要缩进一个空格,但我是按照VS2017默认的格式来的(因为之前没写过C++不是很了解);
    13.Cpplint要求单参数的构造函数需要标识明确,但我没有;

  • 工具中的代码规范里有哪些部分是我之前没想到的?(仅针对使用Cpplint检查我的代码后发现的错误中)
    上述错误中的123458101113

  • 为什么要这样规范呢?这样规范有意义吗?
    我认为这样规范的目的是有如下:
    1.培养代码作者的版权意识;
    2.明确C++和C的变量使用,可能对代码的优化有帮助(猜测);
    3.使代码清晰可读;
    我觉得有意义,但对于使代码清晰可读这一条,我认为一个团队之间只需自己约定好即可,不一定非要遵从工具的默认规定;

结对编程时的代码规范

1.缩进用tab(在两个人电脑上测试,没有出现缩进不齐的情况)
2.大括号{}单独占一行
3.逻辑符号前后的表达式加括号()
4.定义变量分行(一行只定义一个变量)
5.临时变量定义在最近使用的地方
6.所有的类/函数名所有单词的第一个字母都大写(Pascal);所有的变量第一个单词全部小写,后面同Pascal(Camel)
7.类的成员变量形式如下:m_xxx
8.类的声明形式如下:
public:
成员变量;
构造函数;
其他成员函数;
protected:
成员变量;
成员函数;
private:
成员变量;
成员函数;

个人作业-Week 2的更多相关文章

  1. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  2. SQLServer2005创建定时作业任务

    SQLServer定时作业任务:即数据库自动按照定时执行的作业任务,具有周期性不需要人工干预的特点 创建步骤:(使用最高权限的账户登录--sa) 一.启动SQL Server代理(SQL Server ...

  3. 使用T-SQL找出执行时间过长的作业

        有些时候,有些作业遇到问题执行时间过长,因此我写了一个脚本可以根据历史记录,找出执行时间过长的作业,在监控中就可以及时发现这些作业并尽早解决,代码如下:   SELECT sj.name , ...

  4. T-SQL检查停止的复制作业代理,并启动

        有时候搭建的复制在作业比较多的时候,会因为某些情况导致代理停止或出错,如果分发代理时间停止稍微过长可能导致复制延期,从而需要从新初始化复制,带来问题.因此我写了一个脚本定期检查处于停止状态的分 ...

  5. Python09作业思路及源码:高级FTP服务器开发(仅供参考)

    高级FTP服务器开发 一,作业要求 高级FTP服务器开发 用户加密认证(完成) 多用户同时登陆(完成) 每个用户有不同家目录且只能访问自己的家目录(完成) 对用户进行磁盘配额,不同用户配额可不同(完成 ...

  6. 个人作业week3——代码复审

    1.     软件工程师的成长 感想 看了这么多博客,收获颇丰.一方面是对大牛们的计算机之路有了一定的了解,另一方面还是态度最重要,或者说用不用功最重要.这些博客里好些都是九几年或者零几年就开始学习编 ...

  7. 个人作业-week2:关于微软必应词典的案例分析

    第一部分 调研,评测 评测基于微软必应词典Android5.2.2客户端,手机型号为MI NOTE LTE,Android版本为6.0.1. 软件bug:关于这方面,其实有一些疑问.因为相对于市面上其 ...

  8. 软件工程第二次作业——git的使用

    1. 参照 http://www.cnblogs.com/xinz/p/3803109.html 的第一题,每人建立一个GitHub账号,组长建立一个Project,将本组成员纳入此Porject中的 ...

  9. hadoop作业调度策略

    一个Mapreduce作业是通过JobClient向master的JobTasker提交的(JobTasker一直在等待JobClient通过RPC协议提交作业),JobTasker接到JobClie ...

  10. SQL SERVER 2008复制数据库时发生执行SQL Server代理作业错误

    1. 情况说明 在利用SQL SERVER数据库复制向导,能够很方便的将一个数据库从一台服务器复制到另一台服务器上,具体操作步骤也十分简单. 不过在实际操作过程常发生“执行SQL SERVER代理作业 ...

随机推荐

  1. WPF 自定义ComboBox样式,自定义多选控件

    原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...

  2. 3 huigu

    w   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 组件复用 --------------- ...

  3. Redis学习之路(二)之Redis入门基础

    一.Redis基本介绍 (1)Redis介绍 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(string ...

  4. Openstack入门篇(十二)之neutron服务(计算节点)的部署与测试

    1.Neutron组件安装 [root@linux-node2 ~]# yum install -y openstack-neutron-linuxbridge ebtables ipset 2.配置 ...

  5. Codeforces 469 D. Two Sets (并查集)

    题目链接:Two Sets 题意: 有n个数,要分成A.B两组,要求如果x∈A则a-x∈A,如果x∈B则b-x∈B,问是否存在一种符合要求的分法. 题解: 并查集,先增加两个点表示A和B集合的根,对于 ...

  6. [Luogu4921]情侣?给我烧了![错位排列]

    题意 题意很清楚 \滑稽 分析 对于每一个询问 \(k\) ,记 \(g(x)\) 表示 \(x\) 对情侣都错开的方案总数,那么答案可以写成如下形式: \[ {ans}_k= \binom{n}{k ...

  7. python并发编程之守护进程、互斥锁以及生产者和消费者模型

    一.守护进程 主进程创建守护进程 守护进程其实就是'子进程' 一.守护进程内无法在开启子进程,否则会报错二.进程之间代码是相互独立的,主进程代码运行完毕,守护进程也会随机结束 守护进程简单实例: fr ...

  8. python中面向对象_类_对象的概念与定义

    1. 面向对象的概念,面向对象是一种编程思想. 是对现实世界中一类事物的抽象,在编程中可以理解为是一种建立现实世界事物的模型 2.  面向对象和面向过程的区别: 面向过程关注的是完成工作的步骤. 面向 ...

  9. Linux学习之常用命令(二)

    1.上次介绍了一些常用的系统命令,这次又总结了一些小命令,故分享一下: 网卡地址查询的命令: ifconfig #不同于Windows系统,它的是ifconfig而不是ipconfig ip -a # ...

  10. wpf在image控件上快速显示内存图像

    这是在博客园的第一篇文章 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包含图像头等信息)快速显示到界面,那么 ...