软件构造Lab2笔记+心得

**

软件构造Lab2笔记+心得

**
Lab2主要训练ADT的设计、规约以及测试。

ADT中的几个基本概念:
**表示不变量(representation invariant)😗*指的是该ADT的表示永远应该具备的性质,就比如说设计一个三角形的ADT,三条边、内角和180度都应该成为该ADT的表示不变量。这个概念在衡量该ADT的固有属性。

**抽象函数AF(Abstraction Function):**ADT应当实现一种功能,完成由计算机取值所组成的表示空间到ADT的外部表示间的映射,即设计某个ADT的目的是为了表达现实中的某个客观物质(可以是某个物体,可以是某种种概念,可以是某种逻辑),也就是说ADT是为了表示现实,但是期望表达的现实的和计算机内部表达空间并不一致,ADT的设计者应当在ADT的内部完成由计算机空间到现实空间的映射,可以不是单射,但务必是满射。

**表示泄露(rep exposure):**ADT内部设计的数据域和方法应当具有某种权限,某种角度上来说,我们只希望通过该ADT的方法来修改该ADT内部的数据,使用不可变类型是良好的选择,设置访问权限也是良好的选择,使用防御式拷贝也是良好的设计,总之,我们不希望类的外部可以直接修改数据,如果外部可以直接修改数据,那么就发生了表示泄露。良好的ADT的设计不应该发生表示泄露。
由于这三个概念非常重要,我们需要在ADT内部显示的文档化这三个概念。

再来看看一点点小心得。
1.尽量不要将可变类型置于Set集合中,这会使得Set的行为不可控。
2.在ADT的设计时,尽量重写equals()和hashCode()方法,避免比较相等出错和使用其它数据结构出错。
3.继承虽然很有用,但是我们需要注意,不要处处继承,相比于继承,组合也是一种很好的设计ADT的方法。
4.在设计类的时候尽可能设计成不可变类。

最后再结合我的设计分析一下具体的任务。

P1.Poetic Walks
这个部分我觉得有如下难点:
1.理解MIT的实验要求
2.忠实于设计规约的实现:
在规约中说,实现有向的、带权的、带标签的可变图,可能我们会不自主的忽略有从自身到自身的边的图,可规约没说不要有这样的图啊,事实证明,在GraphPoet .java中确实需要这样的图。
3.实现对接口的测试:
我觉得这个更多的是心理上的障碍,不要觉得这是一个新的技术,这样的测试也同样是基于规约的测试。
P2.FriendShipGraph
这个任务我觉得是P1的延续,应用P1的图数据结构实现。
P3.Playing Chess
1.面对大规模任务,会有无从下手的感觉
别慌 淡定 喝口茶 吃包辣条
分析底层ADT,自底向上一步步实现设计
比如Position应该是最基本类,然后是Piece等等
2.对于每个ADT,别着急实现,先写规约,写测试,再实现,测试驱动编程很有好处的。
3.分析表示和实现间的差异,棋盘和用数组表示的棋盘间存在着映射关系,要找到客户端棋盘和内部棋盘间的这种对应关系,这也更提醒我们,要站在不同的角度考虑问题。
具体的映射关系如下:(不同设计可能不同)
外部座标:(x1,y1),内部座标(x2,y2)
y2 = x1;x2+y1=size(数组大小-1)
4.如何确保玩家交互操作
可以利用略带队列思想的做法,玩家1玩完,玩家2入队;玩家2玩完,玩家1入队。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章