软件构造lab2

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

3.1 Poetic Walks
建立对ADT的基本印象,比如如何设计一个能够泛型化的ADT。
加深对AF,RI,rep exposure 这些抽象概念的理解
这个实验给出了一个如何设计泛型ADT的方法,首先先针对某一个特定实例设计具体的ADT:

给出接口Graph
通过不同方法实现该接口,对于该类的实现遵循ADT设计的基本方法,写好Spec,AF,RI,并避免泄露,
3.1.1 Get the code
实验报告中给出了github仓库的的地址

3.1.2 Problem 1: Test Graph
进行测试。

3.1.3 Problem 2: Implement Graph
两种方式实现Graph。

3.1.3.1 Implement ConcreteEdgesGraph

Edge类实现
Edge包含两个String类型,source和target存放每个边的起点终点,一个int类型weight保存权重。

ConcreteEdgesGraph实现
ConcreteEdgeGraph类中含有成员变量:
vertices
edges

3.1.3.2 Implement ConcreteVerticesGraph

Vertex类:
包含一个String类型 label存放该顶点的标签名称,
Map类用于存放以该点为起点的边的信息,即终点和权重

ConcreteVerticesGraph类
ConcreteEdgeGraph类中含有一个成员变量
vertices顶点列表。

3.1.4 Problem 3: Implement generic Graph
改成泛型:将函数声明和调用等修改一下即可

3.1.5 Problem 4: Poetic walks
调用之前我们实现的一个GraphADT图结构实现

3.1.5.1 Implement GraphPoet
方法如下:
GraphPoet
读取文件输入,识别序列,构建图结构。相邻元素,在图中新增边。
poem
两个连续单词A B,利用sources函数,检查图中B的前一个单词,比如存在C到B的边,还存在D到B的边,那就检查C的前一个单词,比方说A到C没有边,A到D有边,那就说明有路径ADB,那么打印诗句的时候就打印ADB

3.2 Re-implement the Social Network in Lab1
利用前面实现的graph,重新实现Social Network。

3.2.1 FriendshipGraph类
函数声明:
addVertex
addEdge
getDistance
多调用Gragh中的函数,很容易改写

3.2.2 Person类
只需要一个label表示姓名即可:

3.3 Playing Chess
ADT设计/实现方案
ACTION BOARD PIECE PLAYER POSITION
PIECE类,int belong记录是哪一方的子,String label记录KING.QUEEN等

POSITION类,记录坐标,每个position都有一个piece,当然棋子的起始设为0,隐形子,相当于没有子

PLAYER类,记个名字就好

BOARD类,构造方法中参数决定棋盘的大小

ACTION类,按指导书的要求完成
心得:
面向ADT的编程和直接面向应用场景编程,需要适应它们的区别
初步体会使用泛型的好处
一个ADT可以在多个应用场景下使用,这种复用,很舒服
为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,是很重要的

猜你喜欢

转载自blog.csdn.net/weiaibeachsea/article/details/93399725