HIT软件构造Lab2记录

本次实验初看让人有点摸不着头脑,先根据模板写测试再编程的顺序在之前完全没见过,但熟悉之后发现效率很高,思路也更清晰,nice

 

目录

 

2 实验环境配置  

3 实验过程  

3.1 Poetic Walks

3.1.1 Get the code and prepare Git repository     

3.1.2 Problem 1: Test Graph <String>  

3.1.3 Problem 2: Implement Graph <String>

3.1.3.1 Implement ConcreteEdgesGraph

3.1.3.2 Implement ConcreteVerticesGraph  

3.1.4 Problem 3: Implement generic Graph<L> 

3.1.4.1 Make the implementations generic  

3.1.4.2 Implement Graph.empty()   

3.1.5 Problem 4: Poetic walks     

3.1.5.1 Test GraphPoet

3.1.5.2 Implement GraphPoet    

3.1.5.3 Graph poetry slam    

3.1.6 使用Eclemma检查测试的代码覆盖度   

3.1.7 Before you’re done     

3.2 Re-implement the Social Network in Lab1

3.2.1 FriendshipGraph     

3.2.2 Person 

3.2.3 客户端main()  

3.2.4 测试用例    

3.2.5 提交至Git仓库 

4 实验进度记录  

5 实验过程中遇到的困难与解决途径

6 实验过程中收获的经验、教训、感想  

6.1 实验过程中收获的经验和教训

6.2 针对以下方面的感受

 

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 Lab2仓库的URL地址(Lab2-学号)。
https://github.com/ComputerScienceHIT/HIT-Lab2-1190201517

 

3.实验过程

3.1Poetic Walks

题目给出了一个graph接口,要求我们完成两个描述图的类,其中一个以边为主体,一个以点为主体,并按要求实现接口中的各种方法,最后使用完成的图抽象数据类型完成诗歌生成的功能

​​​​​​​3.1.1 Get the code and prepare Git repository

通过控制台命令建立本地git仓库,并用clone指令通过给出的url地址下载指定代码包到git仓库中

​​​​​​​3.1.2 Problem 1: Test Graph <String>

思路:首先根据接口的功能描述完成测试程序,测试程序应分别测试接口中给出的各个方法

add:对于点已存在和未存在的情况分别测试,检查输入的点是否在图中。

set:考虑多种情况:边不存在时添加,边已存在时覆盖并返回原权重,权重为0时删除边,权重为负时报错。

remove:点不存在时返回false,点存在时移除该点并返回true,移除后应检查与该点有关的边是否也被移除

vertices:检查点的添加和移除后是否均能正确返回点集

sources和targets:检查添加、移除边后能否正确返回源点集和终点集

​​​​​​​3.1.3 Problem 2: Implement Graph <L>

​​​​​​​3.1.3.1 Implement ConcreteEdgesGraph

建立ConcreteEdgesGraph类和Egde类,Egde类表示边的状态,ConcreteEdgesGraph类实现接口功能,其中各方法功能如下表:

Edge:

方法

功能

checkRep

检查不变性

getSource

返回起始点

getTarget

返回终止点

getWeight

返回权重

toString

按“起始点-权重>终止点”的格式返回表示该边的字符串

 

 

 

 

 

 

 

ConcreteEdgesGraph:

方法

功能

checkRep

检查不变性

add

向图中添加一个点,点的名称不可重复

set

向图中添加一条边,若边存在则覆盖旧边并返回旧边权重,边不存在则新建并返回0,当输入权重为0时移除该边,权重为负时报错

remove

移除一个点和该点连接的边,成功移除返回true,边不存在返回false

vertices

返回图的所有点构成的集合

sources

返回图中所有作为起始点的点和其边构成的集合

targets

返回图中所有作为终止点的点和其边构成的集合

toString

将图中所有边转化为字符串返回,顺序按照边添加的顺序

​​​​​​​3.1.3.2 Implement ConcreteVerticesGraph

建立ConcreteVerticesGraph类和Vertex类,Vertex类表示点及其连接状态,ConcreteVerticesGraph类实现接口功能,其中各方法功能如下表:

Vertex:

 

方法

功能

checkRep

检查不变性

getVertex

返回该点名称

getSources

返回指向该点的点集

getTargets

返回该点指向的点集

addSources\removeSources

添加、删除指向该点的边

addTargets\removeTargets

添加、删除该点指向的边

toString

按“起始点-权重>终止点”的格式返回表示该边的字符串

 

ConcreteVerticGraph:

 

方法

功能

checkRep

检查不变性

add

向图中添加一个点,点的名称不可重复

set

向图中添加一条边,若边存在则覆盖旧边并返回旧边权重,边不存在则新建并返回0,当输入权重为0时移除该边,权重为负时报错

remove

移除一个点和该点连接的边,成功移除返回true,边不存在返回false

vertices

返回图的所有点构成的集合

sources

返回图中所有作为起始点的点和其边构成的集合

targets

返回图中所有作为终止点的点和其边构成的集合

toString

将图中所有边转化为字符串返回,顺序按照点添加的顺序,每个点按边添加顺序输出以该点为起始点的边

 

​​​​​​​3.1.4 Problem 4: Poetic walks

本题要求使用上述图结构,用给定的文件为文本集,连接集合中相邻的词,构建这样的图后,对任意词组成的的字符串,若串中任意两词间在图中存在一个“桥”,就将该桥插入字符串中。

​​​​​​​3.1.4.1 Test GraphPoet

根据题目要求,需要对图的构建、字符串的插入进行测试,分情况需测试空文件、标准文件和多行文件的读入、多种权值比较的情况

​​​​​​​3.1.4.2 Implement GraphPoet

思路:读入文件时,按空格将文件内容按单词拆分为字符串数组,并按上述结构存入图中作为点集,并以此将相邻的单词连接,每一次相邻使权重加一。

对字符串进行插入时,检查以当前词指向的点中是否有指向下一个词的点,在所有符合条件的点中将权重和最高的点插入两词之间,按此规则遍历字符串并输出结果

​​​​​​​3.1.4.5 使用Eclemma检查测试的代码覆盖度

​​​​​​​3.2 Re-implement the Social Network in Lab1

和Lab1中的FriendshipGraph类问题类似,只需将其中方法使用本次饰演的Graph结构实现即可

​​​​​​

实验过程中收获的经验、教训、感想

实验过程中收获的经验和教训

本次实验遇到了时间规划不合理导致任务积压的问题,下次应为实验分配更合理的时间准备

​​​​​​​针对以下方面的感受

1.面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?

面向ADT编程时任务更加模块化,更好理清思路,对项目管理也有很大帮助

2.使用泛型和不使用泛型的编程,对你来说有何差异?

使用泛型编程可以增加程序的泛用性,但因为此前用的不多,有些不熟悉,需要时间理解

3.在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?

使测试不受程序影响,更具客观准确性,目前还不太适应

4.P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?

提高了工作效率,使代码具备复用性

5.为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?

保证了代码的安全性

6.关于本实验的工作量、、deadline

适中,很合适

7.《软件构造》课程进展难度到目前,你对该课程有何体会和建议?

这门课程更多偏向于实际应用中的项目管理、软件开发等方面,更贴近实际而不是理论

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值