软件构造lab2心得体会

一.实验目标概述

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

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

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

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

ADT 的泛型化;

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

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

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

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

在测试代码中,能够写出 testing strategy

二.下面是对lab2具体任务的描述:

(一)、Poetic Walks

实现具有标记顶点的Graph,并且实现一个使用单词的图生成诗歌的类,任务大致有以下三部分:

(1)完善Graph接口类,并运用泛型的思想,将String拓展为泛型L类;

(2)实现Graph类的方法:add、set、remove、vertices、sources、targets;

(3)利用实现的Graph类,应用图的思想,实现GraphPoet类,如果输入的文本的两个单词之间存在桥接词,则插入该桥接词;若存在多个单一桥接词,则选取边权重较大者。

  1. 首先实现edge类

(1)Edge类是不可变的

(2)AF:一条有向边有权重,有起点,有终点

(3)RI:source与target不为空,weight非负

(4)Safety from rep exposure:数据类型不可变且属性私有,每次执行构造函数以及函数返回前,都要checkRep,当获取函数返回前,进行防御拷贝

  1. 接着实现ConcreteEdgesGraph类

(1) ConcreteEdgesGraph类是不可变的

(2)AF:一个edge的集合,其中各条边是有向的

(3)RI:两点之间最多有一条边,并且权值大于0,而且在边集合中的边也一定在点集中

(4)Safety from rep exposure:数据类型不可变且属性私有,每次执行构造函数以及函数返回前,都要checkRep,当获取函数返回前,进行防御拷贝

3. 首先实现vertex类

(1)vertex类是不可变的

(2)AF:一条有向边有权重,有起点,有终点,用两个map和一个string作为label的方式表示

(3)RI:weight非负,所有在a中作为target的b,在b中a也是作为source的

(4)Safety from rep exposure:数据类型不可变且属性私有,每次执行构造函数以及函数返回前,都要checkRep,当获取函数返回前,进行防御拷贝

4. 接着实现ConcreteVerticiesGraph类

(1) ConcreteVerticiesGraph类是不可变的

(2)AF:一个vertex的集合

(3)RI:每两个点的名字必须不同,而且不能为空

(4)Safety from rep exposure:数据类型不可变且属性私有,每次执行构造函数以及函数返回前,都要checkRep,当获取函数返回前,进行防御拷贝

5.最后实现Graphpoet类

首先,在GraphPoet函数中要实现读取.txt文件中的所有的单词,并将所有相邻的点添加到图中,这些边每出现一次会使得权值加1(初始权值设置为0),读取后检查图是否合法。

其次,在poem函数中对目标字符串进行扩充:首先对读取到的字符找寻每两个单词之间是否存在bridge:即前一个的target集中是否存在一个元素也存在于下一个的source里,这里注意在寻找过程中一定要全部遍历,并且记录其中这样的三个点中间的两条边的权值和,直到找到最大的,若没有则不变化,继续遍历下两个单词的集合。

这个任务难度较大,困难主要面向对象编程的方法需要适应,测试优先的编写策略也需要进一步掌握。

(二)、 Re-implement the Social Network in Lab1

     这次任务是为了利用前面构建好的ADT重新编写lab1中的社交网络,任务比较简单,主要是体验ADT的好处。

      先实现person类,在类中应该包含姓名和朋友的信息,然后FriendGraph类构建person类之间的关系,通过修改person中的信息即可。

三.其他感想

对于lab2,我最深刻的体会就是ADT真的太伟大了,虽然在ADT的设计编写过程中很复杂,有许多的规约存在,但是确实可以大大方便编程,在这次实验中重写lab1中的任务,明显感觉到了这一点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值