HIT-软件构造lab2

1 实验目标概述

实验的主要目标是训练ADT的设计、规约、测试和使用OOP技术实现ADT。
主要有下面几个方面:
针对给定的 应用问题,从描述中识别所需 ADT
设计 ADT 的规约并评估规约的质量
根据 ADT 的规划设计测试用例,并写出 testing strategy
实现 ADT 的泛型化
根据规约设计 ADT 的多种不同的实现;针对每种实现,设计 representition、
rep invariant 和 abstraction function。
使用 OOP 实现 ADT 并判定表示不变性是否违反已经是否有 rep exposure

2 实验环境配置

本次实验的配置 需要到eclipse marketplace中下载需要求的EclEmma插件
HIT-软件构造lab2

3 实验过程

直接从给定的链接
link.
中提取本次实验需要的信息

3.1 Poetic Walks

3.1.1Get the code and prepare Git repository

直接从下载好的文件当中提取需要的代码,然后在工作台的lab2文件夹中放置含有该任务的代码文件

3.1.2Problem 1: Test Graph

1 、 主 要 是 测 试 Graph.empty() 函数的 testing strategy 。
测试 在不同的 L 的情况下,只要 L 为 immutable 类型的数据类型就可以使用。所以 测试策略就是使用不同的 immutable 类型的数据,此处选择 Integer 和 Long 以及接下来会使用的String 进行测试,保证测试包括 set、add、remove,Vertices,等函数即可
2、书写测试 Instance 方法的 testing strategy。对每一个需要测
试的函数进行输入空间的划分.

3.1.3Problem 2: Implement Graph

3.1.3.1Implement ConcreteEdgesGraph

定义两个私有String类型source和target存放每个边的起止点,定义一个私有int类型weight保存这条边的权重(长度)
2.在ConcreteEdgesGraph中Edge类测试
Edge中定义了四种操作和重写的tostring方法,getSource,getarget,getweight,cloneEdge,Equals,hashcode方法
3.完成后继续进行edge类和concreteEdgesGraph类,其中又使用了add函数,set函数,remove,vertices,sources,target,tostrin函数
4.直接进行concreteEdgeGraphTest的测试,并使用EclEmma进行覆盖率测试
HIT-软件构造lab2

3.1.3.2Implement ConcreteVerticesGraph

1.Vertex中
另外需要设计 Vertex 类中的 AF、RI 以及 Safety from Rep exposure.
2.在ConcreteVerticesGraphTest需要测试Vertex中定义的操作
对于 Abstraction function,Vertex 类对应的即是“在一条带有权值的有向边中的 Source 点”使用getter setter的操作
3、在完成以上两步后,分别完成 Vertex 类和 ConcreteVerticesGraph 类
①add 函数
进行简单判断然后根据集合中是否已有需要加入的顶点。如果已有,则返回
false,否则将其加入并返回 true。
②set 函数
由于 Vertex 为 mutable 类型,所以与上面 ConcreteEdgesGraph 的写法
不同,需要在设置为新的值之后,将已有的边直接进行更改即可。
③remove 函数
注意在删掉顶点的时候需要将其邻接的边全部删除。
④sources 函数和 targets 函数 ### 3.2.3 Problem 5: Drawing polygons
与正方形相似,只不过利用角度和边数的关系即可

3.1.4Problem 3: Implement generic Graph

3.1.4.1Make the implementations generic

注意将所有的实现全部改为泛型实现即可,然后在更改结束后,重新测试
ConcreteVerticesGraphTest 和 ConcreteEdgesGraphTest 两个测试,可以
测试通过 Graph在两个泛型实现下仍然可以通过,表示更改成功

3.1.4.2Implement Graph.empty()

1.graph.empty 返回一个 Graph 接口的具体实现即可
2、测试 GraphStaticTest

3.2Re-implement the Social Network in Lab1

利用lab1中的的FriendshipGraph类完成P2

3.3Playing Chess

3.3.1ADT设计/实现方案

3.3.1.1Board类

数据类型:
boardSize 棋盘大小
boardSet 储存棋子的集合
playerA,playerB 储存玩家命名,主要是为了返回一些说明字符串时更加明确

3.3.1.2Action类

Action类会解析game类的调用之后调用board执行具体操作,并在操作成功时记录操作历史。
方法:
putPiece 参数 Player player, Board board, Piece piece。调用board. putPiece放置棋子在指定的板上。成功则记录历史。
removePiece 参数 Player player, Board board, Position position。调用board. removePiece移除在指定的板上的指定位置的棋子。成功则记录历史。
checkPos 参数Board board, Position position。调用board. checkPos检查在指定的板上的指定位置的棋子。
countPiece 参数Board board。调用board. countPiece检查双方在指定的板上的棋子的数目。
printHistory 打印历史数组。
move 参数Player player, Board board, Position p1, Position p2。用board. Move移动棋子。

eat 参数Player player, Board board, Position p1, Position p2。用board. Eat实现吃子。

3.3.1.3Game类

声明以下数据类型:
gameBoard是执行操作的棋盘对象。
gameAction是执行操作的action类的实例。
PlayerA和PlayerB是尚未被初始化的两个选手。

3.3.1.4Piece类

Piece 参数:String pieceName, int owner。构造方法赋予一个新棋子名字和所有者参数。
setPosition 参数:Integer x, Integer y。通过参数x,y新建一个位置。将目标棋子位置修改。

3.3.1.5Player类

方法:
getPlayerTurn 返回玩家出手顺序
setPlayerTurn 参数:Integer turn,设置玩家出手顺序
getPlayerName 返回玩家名字
setPlayerName 参数:String playerName,设置玩家名字

3.3.1.6Position类

省略getter方法
Position 参数:int px, int py。构造方法
equals 参数:Position P。判断当前位置与目标位置是否相等

3.3.2主程序MyChessAndGoGame设计/实现方案

方法:
goGameMenu 输出围棋的菜单
cheseGameMenu 输出国际象棋菜单
gameMain 游戏尚未明确类型时的客户端函数
goGame 执行围棋操作
cheseGame 执行国际象棋的函数
main 声明一个MyChessAndGoGame实例,调用gameMain方法,启动游戏。

游戏流程:
首先mian,新建实例,开始gameMain方法。

gameMain方法读取玩家输入选择游戏的种类,

初始化玩家名字,初始化棋盘,

之后按游戏种类调用两个游戏方法:

在游戏函数中,针对落子,提子,吃子一类操作,都由客户端读取输入,分解用户输入,检查输入是否合法:(这里以落子为例,其他类似)

之后传递参数让game类执行操作,game类再由声明的action实例调用board类执行一系列落子,提子,吃子操作,并返回成功与否的布尔值。如果执行不成功输出错误提示信息,如果成功,由action类记录历史,返回真值,game类返回真值给客户端,客户端收到真值后,令TURN = (TURN + 1) % 2;,达到令TURN在0,1之间反复的效果。以此判断下一个选手是谁。

如果输入是end,修改exitflag之后,退出。
之后选择是否输出游戏历史:

3.3.3ADT和主程序的测试方案

主程序主要使用手动测试的方法,针对参数越界,控制权不符合要求,输入参数不足等情况手动测试。
具体操作主要是在board类,所以对board类详细测试:
主要测试putPiece,removePiece,move,eat几个重点操作
HIT-软件构造lab2