软件构造lab2心得与体会

0x00 序

lab2对于java初学者来说是很硬核的,其中涉及到的知识确实不少。

0x01 Poetic Walks

  1. ADT
// interface
public interface Graph<L> {
	...
}
// implement wahtever type you want
public class ConcreteVerticesGraph implements Graph<String/...> {
	...
}
  1. 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;
	}

	...
  1. Set

java Set包含三种:Hashset/Treeset/LinkedHashset

创建(new)时需要指明:

Set<String> res = new HashSet/...<>();

详见此文

  1. Map
// Map
Map<String ,Integer> map;
map.put("Monday", 1);
System.out.println(map.get("Monday"));
// shoulde be 1
map.remove("Monday");
  1. ArrayList

遍历:
①get(int index)方法
②for(type e : list){ … }
③iterator
删除:
防止错误最好使用iterator.remove() 详见此文

  1. 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的如下内容:

  1. 它在用户看来会是怎么样的一种数据类型(A空间)

  2. 为实现这个抽象数据类型我们应该用什么样的数据结构(R空间)

  3. R空间中有哪些数据是不在考虑范围内的(错误的),我们需要考虑有什 么样的限制让数据均在合法范围内(checkRep)

上述内容构思完基本可以写出af&ri和规约了,下面考虑如何码出来:

  1. 将field设为private并辅以getter访问基本上是标配
  2. 确定它是否是可变的,这决定了是否有Mutator(setter等方法)
  3. 根据功能完善Observer、Producer
  4. 检查自己的方法,查看是否有表示泄露

可以说本次实验最大的收获便是如何从零开始构造一个ADT,这是java赋予用户的财富:自由构造数据类型。只有通过自己亲手实践才能慢慢体会到,遵循一些看上去很复杂的规定最后都是为了一个圆润、完美、令人极度舒适的结局。

你可能感兴趣的:(java与软件构造)