0x00 序
lab2对于java初学者来说是很硬核的,其中涉及到的知识确实不少。
0x01 Poetic Walks
- ADT
// interface
public interface Graph<L> {
...
}
// implement wahtever type you want
public class ConcreteVerticesGraph implements Graph<String/...> {
...
}
- OOP
public class object{
private int num;
private string label;
//constructor
public object(String label){
this.label = label;
}
//getter
public int getNum(){
return num;
}
//setter
public void setNum(int num){
this.num = num;
}
...
- Set
java Set包含三种:Hashset/Treeset/LinkedHashset
创建(new)时需要指明:
Set<String> res = new HashSet/...<>();
- Map
// Map<Key, Value>
Map<String ,Integer> map;
map.put("Monday", 1);
System.out.println(map.get("Monday"));
// shoulde be 1
map.remove("Monday");
- ArrayList
遍历:
①get(int index)方法
②for(type e : list){ … }
③iterator
删除:
防止错误最好使用iterator.remove() 详见此文
- assert
// if label == NUll , exit and print
assert label != null : "label NULL!";
// if label == NULL , exit
assert label != null;
0x02 改写lab1的FriendshipGraph
可以说有了P1的改写后十分简单,基本没有工作量。值得注意的是ADT的封装,这里涉及到非常多的知识,这种开发模式很让我摸不着头脑,但经过P3的磨练,基本已经摸清了道路。
0x03 MyChessAndGoGame
从零开始设计ADT完成问题,对于java新手来说最困难的是构思自己的ADT,即要想清楚什么类里应该放什么变量,要完成什么功能。可以说是一个小步试错,快速迭代的过程。弄明白ADT的设计到底是什么回事,其中的af&ri到底表示了什么,细读MIT的资料是一个不错的选择(Readings10-11)
Readings10翻译与总结 Readings11翻译与总结
对于一个ADT来说,我们十分强调它的封装性与不变性。根据要满足的功能,我们得先构思出ADT的如下内容:
-
它在用户看来会是怎么样的一种数据类型(A空间)
-
为实现这个抽象数据类型我们应该用什么样的数据结构(R空间)
-
R空间中有哪些数据是不在考虑范围内的(错误的),我们需要考虑有什 么样的限制让数据均在合法范围内(checkRep)
上述内容构思完基本可以写出af&ri和规约了,下面考虑如何码出来:
- 将field设为private并辅以getter访问基本上是标配
- 确定它是否是可变的,这决定了是否有Mutator(setter等方法)
- 根据功能完善Observer、Producer
- 检查自己的方法,查看是否有表示泄露
可以说本次实验最大的收获便是如何从零开始构造一个ADT,这是java赋予用户的财富:自由构造数据类型。只有通过自己亲手实践才能慢慢体会到,遵循一些看上去很复杂的规定最后都是为了一个圆润、完美、令人极度舒适的结局。