P1
1.设计目标
首先对图的ADT进行两种实现(从边和顶点出发),然后选择一种实现的ADT,根据输入的文件构建语料库,再利用构建的语料库,对输入字符串进行插入操作,并返回修改后的字符串。
2.有关AF和RI的概念,在实验刚开始时是没有讲到的。进一步学习之后才完成代码的这个部分。
AF:R->A(抽象函数)给出R空间的数据,如何映射到A空间的解释。
RI:R->boolean(表示不变性)某个具体的表示是否是合法的。也可以将RI看成所有表示值的一个子集,包含了所有合法的表示值。同时可以将RI看作描述什么是合法表示值的条件。
3.接口是不允许存在构造方法的,因为接口无法被实例化。接口中可以存在工厂方法,返回接口的实现的实例,从而构造出具有接口所有方法的实例。
4.在不可变类中,方法不能直接返回可变的引用类型。因为这么做会造成表示暴露。正确的做法应该是返回其复制,即防御式拷贝。
P2
1.有关private成员域的继承问题
在实现FriendshipGraph类时,老师明确要求用继承写,而不能调用Graph的工厂方法创建图的实例。这让我很疑惑,因为刚完成的图的两种实现中,它们的成员域都是private final修饰的,也就是说无法被继承的。既然没有父类的成员域,那怎么完成使用父类成员域的成员方法呢?
从网上查找博客,我了解到,父类的privare成员域其实是被继承了,但是子类没有访问权限,只能通过调用继承父类的方法,对父类的private成员域进行修改。这也就能说得通了。
P3
1.将小的、表示数据的类设置成不可变类。如Player类、Piece类、Positon类。而Board类则必须是可变类,因为棋盘上的棋子会发生变化。
2.关于如何实现游戏结束后查看走棋历史,我选择在Action类中设置一个StringBuilder成员域,在每个操作调用完成后,在该成员域添加一行操作信息。当需要查看走棋历史时,将其转化成String类型并返回即可。
3.客户端代码设计
-初始化
获得输入信息后,对游戏进行初始化。由于两类游戏的棋盘大小和棋子的初始状态不同,而玩家信息相同,所以在创建玩家实例之后对两种游戏分别进行初始化。在初始化象棋游戏时,将象棋棋子添加到棋盘上。
-进行游戏
用int类型的变量operation记录用户输入的操作,从1到8每个数字代表一种操作,在终端中显示(通过调用printMenu方法)。然后将该值传入performAction方法,进行对应操作。该方法返回布尔值,标记是否操作成功。如果操作成功,则进入对方回合(round取反),否则仍是当前玩家的回合。
-游戏结束
游戏结束时会提示玩家是否查询走棋信息。如果是,则打印走棋历史,否则直接退出游戏。