OO第四单元总结&&课程感想
OO第四单元总结&&课程感想
OO四个单元已经结束,感觉自己的编程能力长进了很多,对面向对象思想的理解也深刻了很多。第四单元目标是实现一个UML分析器,包括分析UML类图,UML时序图,UML状态图。整体代码量很大,大部算法采用BFS实现。
UML分析器架构
第一次作业
第一次作业主要实现类图分析器,我自己实现了MyParseElement类,这是一个抽象类,里面实例化一个UmlElement。
public abstract class MyParseUmlElement {
private UmlElement umlElement;
public MyParseUmlElement(UmlElement umlElement) {
this.umlElement = umlElement;
}
public UmlElement getUmlElement() {
return umlElement;
}
public String getId() {
return umlElement.getId();
}
public String getParentId() {
return umlElement.getParentId();
}
public String getName() {
return umlElement.getName();
}
public ElementType getElementType() {
return umlElement.getElementType();
}
}
将对应的models包里面所有的element解析一遍,所有其他的element继承这个抽象类。在实现的过程中,要注意ID之间的关系,比如
UmlAttribute的ParentId有可能是UmlInterface或者UmlClass。那么在MyParseUmlInterface中和MyParseUmlClass中要实例一个MyParseUmlAttribute容器。并在建图的时候加入进去。
对于顶层MyUml类,我们进行“建图”,即遍历所有的UmlElement[ ],创建相应的MyParseElement的子类(多态)。并将各自存储在对应的ParentID对应的MyParseElement里面。
UML类图
第二次作业
第二次作业的架构跟第一次作业思路类似,也是通过继承UmlElement抽象类来实现。
UML类图
- 顺序图解析器
- 状态图解析器
第三次作业
跟前面作业架构类似。主要增加了一些异常判断的方法。
BFS
主要采用队列来实现,将初始对象加入到队列当中,再用一个HashSet存储已经遍历过的节点的ID。每次遍历从队列里面poll出要遍历的节点。如getClassAssociatedClassList()方法的实现。
public List<String> getClassAssociatedClassList() {
ArrayList<String> result = new ArrayList<>();
HashSet<String> visited = new HashSet<>();
Queue<MyParseUmlClass> queue = new LinkedList<>();
queue.add(this);
while (!queue.isEmpty()) {
MyParseUmlClass myParseUmlClass = queue.poll();
for (MyParseUmlElement item : myParseUmlClass.getAssociations()) {
if (!visited.contains(item.getId()) &&
item.getElementType() == ElementType.UML_CLASS) {
visited.add(item.getId());
result.add(item.getName());
}
}
if (myParseUmlClass.getFather() != null) {
queue.add(myParseUmlClass.getFather());
}
}
return result;
}
四个单元中架构设计及OO方法理解的演进
第一单元
第一单元的多项式求导,我刚刚接触Java,对OO的理解比较浅薄,关注的比较多的是算法。我第一次运用多态实现了一个二叉树。
对于接口,性能考虑得比较少。所以重构了两次。第一单元的作业我觉得还是应该多加尝试尝试各种实现方法,接口,抽象类啥的。
第二单元
第二单元主要是多线程,对于Java语法要求不高。但对于设计模式有很强的要求。整体采用生产者消费者模式。这单元要把电梯运行抽象成为实际的问题。
第三单元
第三单元主要是照着JML规格写代码,要注重数据结构的使用,这一单元的重点是性能,要懂得用空间去优化时间。
第四单元
第四单元的架构主要是多态,要充分运用多态。这单元代码庞大,类很多,要学会使用Package。到了第四单元,面向对象的基本思想我已经掌握的差不多了,对于接口,抽象类的使用也比较熟练了。
测试
数据分为随即构造和手动构造。
手动构造的数据前几次作业还行,后面根本不可能了。对于随机制造,我没有掌握数据的构造方法。(希望以后有精力的话好好研究研究)
测试的正确性判定:对拍(与python第三方库对拍,与别人代码对拍),状态机(电梯)
测试工具:Junit,Jprofile,手动构造评测机。
测试是一个很重要的东西,基本的通过Python调用Jar包我还是会的,但是对于构造有强度且合法的数据,我觉得有点难度,有时间我一定好好摸索摸索。
课程感想
这门课可以说是非常的practical,学到了很多的东西,包括Java基本的语法,设计模式,Git,以及Typora。我发现OO其实是一个哲学思想,其实很多事情我们都可以看成是对象和对象的交互。比如我这学期拼了一个拼图,它其实可以分成山,水,山人等对象,把小的拼图块分类之后会好拼许多。这门课不仅提高了我的代码能力,更给我了一个全新的视角看待世界。
建议
1.感觉课堂老师讲的跟作业有点脱节,希望老师每节课能先讲一下作业的架构。
2.感觉实验课可以改进一下,变成闯关制度,增添课上评测功能
3.希望UML单元的指导书写的详细一点,第四单元编程难度不大,但是指导书有时候迷惑性真的很大。