软件工程结对作业2

1 前言

    本次软件工程第二次作业由1603班马行健作为驾驶员,我作为领航员,我们合作完成电梯调度算法的实现。我的主要任务是代码审查与单元测试。

2. 代码测试

2.1 通过图形化界面进行功能测试

2.1.1 电梯内部功能测试

    初始时所有电梯都在第一层停靠,从左向右依次为1、2、3、4、5号电梯。如图1。
在这里插入图片描述

**图1**
    按动电梯1内部按钮10,电梯2内部按钮11,电梯3内部按钮12,电梯4内部按钮13,电梯5内部按钮14,使他们上行到固定楼层运行结果如图2。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190505192725547.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTE3NTU4OQ==,size_16,color_FFFFFF,t_70)
**图2**
    各个电梯到达相应楼层后,按动电梯1内部按钮5,电梯2内部按钮4,电梯3内部按钮3,电梯4内部按钮2,电梯5内部按钮1,使他们下行到特定楼层运行结果如图3。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190505193040114.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTE3NTU4OQ==,size_16,color_FFFFFF,t_70)
**图3**
### 2.1.2楼层间电梯调度测试     使电梯1到达5层,电梯2到达6层,电梯7到达,电梯4到达8层,电梯5到达9层,如图4。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190505194522213.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTE3NTU4OQ==,size_16,color_FFFFFF,t_70)
**图4**
    按动楼道中的电梯上行按键15,结果如图5。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019050519462310.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTE3NTU4OQ==,size_16,color_FFFFFF,t_70)
**图5**
    再按动楼道中下行按键2,结果如图6。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190505194741199.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTE3NTU4OQ==,size_16,color_FFFFFF,t_70)
**图6**
    结果分析:上行时电梯5在9层离15层最近,下行至1层时电梯1在5层离1层最近,这说明电梯算法符合用户平均等待时间尽可能小的需求。 ## 2.2 通过Junit测试工具编写测试代码进行功能测试

3 代码审查及评价

3.1代码审查

    代码审查表如下,

重要性

激活

级别

检查项

总计

命名

重要

Y

20

命名规则是否与所采用的规范保持一致?

Y

20

是否遵循了最小长度最多信息原则?

重要

Y

50

has/can/is前缀的函数是否返回布尔型?

注释

重要

Y

10

注释是否较清晰且必要?

重要

N

10

复杂的分支流程是否已经被注释?

N

10

距离较远的}是否已经被注释?

N

10

非通用变量是否全部被注释?

重要

N

50

函数是否已经有文档注释?(功能、输入、返回及其他可选)

N

10

特殊用法是否被注释?

声明、空白、缩进

Y

20

每行是否只声明了一个变量?(特别是那些可能出错的类型)

重要

Y

40

变量是否已经在定义的同时初始化?

重要

N

40

类属性是否都执行了初始化?

Y

20

代码段落是否被合适地以空行分隔?

Y

20

是否合理地使用了空格使程序更清晰?

Y

20

代码行长度是否在要求之内?

Y

20

折行是否恰当?

语句/功能分布/规模

Y

20

包含复合语句的{}是否成对出现并符合规范?

Y

20

是否给单个的循环、条件语句也加了{}

Y

20

if/if-else/if-else if-else/do-while/switch-case语句的格式是否符合规范?

Y

40

单个变量是否只做单个用途?

重要

Y

20

单行是否只有单个功能?(不要使用;进行多行合并)

重要

Y

40

单个函数是否执行了单个功能并与其命名相符?

Y

20

操作符++和 操作符的应用是否复合规范?

规模

重要

Y

20

单个函数不超过规定行数?

重要

Y

100

缩进层数是否不超过规定?

重要

N

100

是否已经消除了所有警告?

重要

Y

40

常数变量是否声明为final

重要

N

80

对象使用前是否进行了检查?

重要

N

80

局部对象变量使用后是否被复位为NULL

重要

Y

70

对数组的访问是否是安全的?(合法的index取值为[0, MAX_SIZE-1])。

重要

Y

20

是否确认没有同名变量局部重复定义问题?

Y

20

程序中是否只使用了简单的表达式?

重要

Y

20

所有判断是否都使用了(常量==变量)的形式?

Y

80

是否消除了流程悬挂?

重要

Y

80

是否每个if-else if-else语句都有最后一个else以确保处理了全集?

Y

80

for循环是否都使用了包含下限不包含上限的形式?(k=0; k<MAX

Y

40

对于流操作代码的异常捕获是否有finally操作以关闭流对象?

N

20

退出代码段时是否对临时对象做了释放处理?

可靠性(函数)

重要

Y

60

入口对象是否都被进行了判断不为空?

重要

Y

60

入口数据的合法范围是否都被进行了判断?(尤其是数组)

重要

Y

20

是否对有异常抛出的方法都执行了try...catch保护?

重要

N

80

是否函数的所有分支都有返回值?

重要

Y

50

int的返回值是否合理?(负值为失败,非负值成功)

N

20

对于反复进行了int返回值判断是否定义了函数来处理?

Y

60

关键代码是否做了捕获异常处理?

重要

Y

60

是否确保函数返回CORBA对象的任何一个属性都不能为null?

重要

Y

60

是否对方法返回值对象做了null检查,该返回值定义时是否被初始化?

重要

Y

60

是否对同步对象的遍历访问做了代码同步?

重要

N

60

线程处理函数循环内部是否有异常捕获处理,防止线程抛出异常而退出?

重要

Y

100

函数对错误的处理是恰当的?

可维护性

重要

Y

100

实现代码中是否消除了直接常量?(用于计数起点的简单常数例外)

Y

20

是否消除了导致结构模糊的连续赋值?(如a= (b=d+c )

N

20

是否每个return前都要有日志记录?

N

20

是否有冗余判断语句?(如:if (b) return true; else return false;

N

20

是否把方法中的重复代码抽象成私有函数?

## 3.2 评价 总体来讲马同学这次的代码比上次代码写的好。主要体现在一下几点: - 代码注释详略得当。 - 代码结构清晰易读。 - 代码不冗余。

不足之处:

  • 算法实现中使用了多线程,在多线程的程序中要有对多线程同步的处理的代码。具体表现在对线程访问的方法(synchronized修饰)加锁,或者对部分线程共享的代码块加锁。再或者为了提高效率可以继承LOCK类,自定义分配锁。
  • 功能不完善。

4 总结

工作照片

**图7**
原文地址:https://www.cnblogs.com/jiaorenzhan/p/10813785.html