[Java]软件构造LAB2实验总结

经过LAB1的洗礼,对于软件构造这门课以及java编程有了一些认识。虽然LAB2相较于LAB1难度大增,但至少不会陷入LAB1时那种手足无措的境地,LAB2主要针对的是ADT与OOP的相关知识。

P1 Poetic Walks

实验目标:学习泛型编写,构造一个Graph并实现其基本功能,编写Edge与Vertice两种接口,分别具体实现,最终用构造好的graph实现Poetic Walks功能

从git仓库获取代码部分略

选择以Edge方式作为Graph的具体实现

编写ConcreteEdgesGraph与ConcreteVerticesGraph类

1.记得在代码中加上AF、RI、Safety from rep exposure等注释,便于自己也便于他人理解代码

2.对于fields中的变量用private修饰,避免暴露

3.对于Edge类与Vertices类要有get方法与checkRep()

4.对于Concrete类中的checkRep(),限定条件尽可能多,减少程序出bug的可能性

5.Concrete类中的方法尽量编写全面,覆盖到所有要求的操作

6.记得编写Junit测试文件,检查程序潜在的问题

7.ConcreteEdge与ConcreteVertices类中的方法大同小异,在set方法上可能会有较大不同

对Graph类使用泛型

将String改成L Edge/Vertex改为Edge<L>/Vertex<L>

将Graph应用泛型方法

Poetic Walks

1.编写GraphPoet()方法时可以用scanner输入txt中的字符串

2.使用split对字符串进行分割 split("\\s")可以分割所有空白符号,避免被空格,回车等干扰

3.添加单词时用Bridge桥接方法进行处理

 

P2 Re-implement the Social Network in Lab1

实验目标:重新实现LAB1中的实验3社会网络

基本没什么好说的 程序思路与应用功能都不变

使用ADT与OOP重新编写

P3 Playing Chess

实验目标:LAB2中最难的实验,要求自己设计一套ADT,实现象棋与围棋的各种操作(如提子,吃子,移子等),但可以在很大程度上不遵循现实规则,即只需实现这些操作而不用管这些操作的前提是否符合实际

3.1 ADT

1.Position 代表棋子位置,具有get与set方法

2.Piece 代表游戏的棋子 具有get与set方法外还具有remove方法

3.Player 代表游戏玩家 具有get方法,除此之外

add/removePiece方法用来添加/移除棋子 

getNumber()用于返回当前玩家所拥有的处于棋盘上的棋子数量

addHistory()用于添加该玩家的动作到该玩家的历史记录中,后期调用其他方法获得该玩家的历史记录

4.Board 代表游戏棋盘 具有get方法与set方法(需要重写加上错误判断)

除此之外还要setnotplaced方法将棋盘位置设置为未占用

5.Action 抽象接口,代表游戏中进行的操作,类似于ConcreteEdges/VerticesGraph与Graph的关系

empty()方法 根据传入的数据,创建新的空Action

5.1 ConcreteChessAction

象棋类具体实现

createPlayer1/2()方法 创建两名新玩家

board()方法 返回当前棋盘的情况

initialize()方法 初始化棋盘,生成一组棋子并分给两名玩家,在棋盘上对应的位置放置好棋子等操作

movePiece()方法 象棋中的移子操作,首先需要对各种异常情况加以判断,若出现异常情况直接返回false,若无异常情况,根据给定的坐标将棋子从起点移至终点,并记录历史记录,同时更新棋盘域与玩家的Pieces域,对于围棋直接返回false

eatPiece()方法 象棋中的吃子操作,首先需要对各种异常情况加以判断,若出现异常情况直接返回false,若无异常情况,根据给定的坐标将棋子从起点移至终点并吃掉终点的棋子,记录历史记录,同时更新棋盘域与玩家的Pieces域,对于围棋直接返回false

5.2 ConcreteGoAction

围棋类具体实现

createPlayer1/2()方法 创建两名新玩家

board()方法 返回当前棋盘的情况

initialize()方法 初始化棋盘,对于围棋可无需初始化,即初始为空棋盘

placePiece()方法 围棋中的落子操作,首先需要对各种异常情况加以判断,若出现异常情况直接返回false,若无异常情况,在对应位置落子并记录历史记录,同时更新棋盘域与玩家的Pieces域,对于象棋直接返回false

removePiece()方法 围棋中的提子操作,首先需要对各种异常情况加以判断,若出现异常情况直接返回false,若无异常情况,在对应位置提子并记录历史记录,同时更新棋盘域与玩家的Pieces域,对于象棋直接返回false

6.Game 代表游戏类 除了get方法外如下图所示

3.2 主程序

使用NewGame方法创建新游戏

选择进行chess或go游戏,并生成对应的棋盘后将其打印实现可视化操作

通过编写print相关方法来实现打印菜单、打印国际象棋棋盘的操作

通过choose方法来令玩家选择接下来进行的操作

3.3 测试

1.写好测试策略,提前对即将开始编写的测试内容有一个框架

2.大部分ADT都可以通过assertTrue或assertEquals来测试,但是对于Action类则类似于P1的测试方法

3.先编写ActionInstanceTest,然后两种具体类的测试在继承ActionInstanceTest后分别编写

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值