经过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后分别编写