软件构造实验2 : 实验记录

1. 实验目标概述本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现ADT。具体来说:l 针对给定的应用问题,从问题描述中识别所需的ADT;l 设计ADT规约(pre-condition、post-condition)并评估规约的质量;l 根据ADT的规约设计测试用例;l ADT的泛型化;l 根据规约设计ADT的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant...
摘要由CSDN通过智能技术生成

1.     实验目标概述

本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现ADT。具体来说:

l  针对给定的应用问题,从问题描述中识别所需的ADT;

l  设计ADT规约(pre-condition、post-condition)并评估规约的质量;

l  根据ADT的规约设计测试用例;

l  ADT的泛型化;

l  根据规约设计ADT的多种不同的实现;针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)

l  使用OOP实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure);

l  测试ADT的实现并评估测试的覆盖度;

l  使用ADT及其实现,为应用问题开发程序;

l  在测试代码中,能够写出testing strategy并据此设计测试用例。

2.     实验环境配置

在idea中创建项目,然后建立本地仓库

再将本地仓库与GitHub仓库关联

在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。

3.     实验过程

请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。

3.1.     Poetic Walks

该任务主要是ADT的内容,要自己实现一个有向图的抽象数据类型,在实验中要掌握AF RI 和rep等概念

3.1.1.     Get the code and prepare Git repository

直接从老师发的github的链接中获取实验代码,将其导入到本地工程中

之后在项目文件夹建立本地仓库

在idea中创建项目,然后建立本地仓库

再将本地仓库与GitHub仓库关联

3.1.2.     Problem 1: Test Graph <String>

3.1.2.1. 测试add

分成三种情况讨论

(空)

(非空,同点)

(非空,不同点)

用contains()和size()保证图的点集正确

3.1.2.2. 测试set函数

    /**

     * 测试set函数

     * 测试策略:

     * weight: 0、非0

     * source:已存在、不存在

     * target:已存在、不存在

     * 原来的source与target之间:有边、无边

     */

做一个比较详尽的测试·,尽量覆盖所有可能,主要关注对不存在的点和边的操作

要用contains去看有没有缺少或多出来点,边的多少通过下一个set()的结果反映

3.1.2.3. 测试remove函数

    /**

     * 测试remove函数

     * 该点:存在、不存在

     * 与该点邻接的边:存在、不存在

     */

注意不要用source和target函数等还没测的函数,否则出错了可能看不出来是哪里的问题

用已经测试过的set更好

3.1.2.4. 测试vertices

    /**

     *测试vertices函数

     *测试策略:

     * 点集:为空 ,一个点,多个点

     */

尤其要注意测试是否有表示泄露,是否是immutable的

3.1.2.5. 测试Sources

注意测试边的方向相反的边是否会引起不该有的增加

3.1.2.6. 测试targets

测试方法同上

测试结果(后补充):

3.1.3.     Problem 2: Implement Graph <String>

以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。

3.1.3.1.      Implement ConcreteEdgesGraph

Edge类的实现

AF:

RI:

Rep exposure:

构造器:

普普通通,符合RI即可

由于Edge类要求是immutable类型的,所以类中所有成员都必须是final关键字标识的

由于graph中的set可能涉及到更改边的权值,所以在edge实现了判断同一条边的函数,这里和equals是不同的 不比较weight

       实现sameedge:

       实现equals

Edge类中要求保持的不变量为:

Target与source不为null且不相等,然后权值大于0

利用checkrep判断

剩下的几个method 都比较简单,都不加赘述了

ConcretEdgeGraph类的实现

AF:

RI:

Rep exposure

checkRep

关键是要调用上面的egde里的sameEdge来检查没有相同的重复边

由于是set 不用关心有没有重复的点

set实现:

完成删边操作 对不存在的边也返回0

加边和调整放在一起实现

这里注意到要顺便把可能的重复边也删了

remove实现:

先去边再去点,注意不能foreach 有改动

用i来遍历 i--

vertices()实现

注意防御性拷贝

sources()实现

ta

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值