zoukankan      html  css  js  c++  java
  • 软件工程结对作业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**
  • 相关阅读:
    排序算法(一)冒泡法
    java是传值还是传引用
    赫夫曼树与赫夫曼编码
    数据结构的相关概念
    字符集和字符编码的区别
    redis为什么选择单线程工作模型
    GET和POST请求的核心区别
    MySQL数据类型及后面小括号的意义
    java中的数据类型
    Jedis无法连接centOS7上的redis
  • 原文地址:https://www.cnblogs.com/jiaorenzhan/p/10813785.html
Copyright © 2011-2022 走看看