Lab1中,主要是让我们对于java的语法和操作有一点整体感知。训练基本 Java 编程技能,能够利用 Java 开发的功能模块,能够阅读理解,写测试用例,初步保证所开发代码的正确性。 还有就是学习使用git的基本操作。
因为课程进度的原因,写lab1的时候并没有接触到ADT、OOP的相关知识。我关于面向对象程序设计的最初印象只有以前使用flash写actionScript的二三经验,具有一点对于面向对象模式的朴素感知,所以撰写lab1的时候,有很多粗糙的地方。
MagicSquare类的写法,基本是按照C语言程序撰写经验中面向过程的经验写的。MagicSquare类中包含两个静态public类,并且在main函数中调用它,这本质上还是按照面向过程的思维撰写的、简单线性的程序。插曲:因为是初次接触java,我在一开始操作的时候甚至不知道main函数应该怎么写,一开始main函数没有写参数,导致程序一直运行不起来。
第三个部分中,friendshipgraph类的实现同样具有问题。首先是当时并没有关于spec、RI、rep泄露以及AF的相关概念,在该类下面field中定义了一个public对象,在客户端程序中可以随便修改它,在设计理念中这会导致严重bug的危险性。实际上为了避免表述泄露,person类应当写成private并且使用observer方法,亦应利用防御式拷贝避免泄露。
(对ADT不熟悉时的朴素实现)
另外在addVertex中
public void addVertex(Person P) {
if (person.contains(P.name)) {
System.out.print("This person already exists in the graph.");
System.exit(0);
}
person.add(P.name);
}
检查person是否重复,这实际上是RI的一个体现,即这个类中始终不应包含相同的两个人。
关于逻辑实现,本次实验的逻辑还是比较简单的,建立一个邻接表即可。唯一稍微复杂的部分是设计一个BFS,按照邻接表的思路进行遍历就行。
public int getDistance(Person A, Person B) {
if (A == B)
return 0;
else {
Queue queue = new LinkedList();
Map BFSMap = new HashMap();
BFSMap.put(A, 0);
queue.offer(A);
while (!queue.isEmpty()) {
Person current = queue.poll();
List friends = current.friends;
Iterator p = friends.iterator();
while (p.hasNext()) {
Person nxtPerson = (Person) p.next();
if (!BFSMap.containsKey(nxtPerson)) {
queue.offer(nxtPerson);
BFSMap.put(nxtPerson, BFSMap.get(current) + 1);
if (nxtPerson == B) {
return BFSMap.get(nxtPerson);
}
}
}
}
}
return -1;// Error
}
实验中,关于github的配置也遇到了一定问题,因为在本次实验前从来没有利用VCS进行版本控制,而是使用原始的版本控制方案(线性地)。第一次push的时候是使用网页版程序试着上传了程序,这样的话感觉并没有本地git管理那么方便。因此下载、配置git,按照网上查找的方法push时遇到了错误。结果突发奇想,加了个-f参数就强行地上传上去了。
git不仅能对程序代码进行版本控制,亦能对其他生产力工具的源程序进行版本控制。在本次实验了解了这个工具之后,我也利用git对.cpr工程文件进行了版本控制的尝试。不过对于这种偏向于线性的、不易产生分支的工程发展,使用git显得有点多余。



