OO第四单元总结
一、本单元三次作业架构设计
本次作业属迭代写解析UML的工具,从第一次对类图的解析到第二次对状态图和顺序图的解析再到第三次新增检查规则。我的基本架构在三次作业中都没有发生改变,只做了部分整合。因此就直接拿第三次作业来分析了。

面对一条条UML元素,我需要做的是解析出元素内容,将数据进行整合以便查询等操作使用。在第一次作业中,重要就是针对类这个主体来处理数据。像类中有属性,方法,类有自己继承的父类或者子类,类会实现不同的接口,类会有不同的关联,因此我重写了类以便整合这些数据,在其中添加像是属性集、方法集、父类、实现接口集等属性,并提供方法查询。其他的一些元素同理。在开始再把这些不同的元素根据需要按类别存入hashmap以方便查询操作时的遍历等。在第二次作业中我们需要完成顺序图和状态图的分析,基本处理的逻辑与第一次作业一样,在此不再赘述,最终将这三个图的实例对象放入要求实现的类中以避免使MyUmlGeneralInteraction太过复杂。第三次作业主要添加了规则的判断,对规则的理解极为重要。我主要遇到的坑点就是自己继承自己也算循环继承,在水群和讨论区的帮助下也算顺利完成了(确实少踩了许多坑,像什么名字是null时跳过R001之类的)。最后这一单元也算比较顺利,除了第一次作业中寻找类实现的接口集由于未对已经访问过的接口进行标记导致重复访问以外,其他地方均没有出现bug。
二、四个单元中架构设计以及OO方法理解的演进
第一单元
第一单元的主要内容是多项式求导。感觉这一单元主要是帮助我们从面向过程编程走向面向对象编程的辅助,同时也让我们更加熟悉java这门语言和工厂模式等。说实话,在这一单元中由于第一次接触,我的架构基本可扩展性很差,三次作业我就重构了三次,并没有在一开始就写出迭代性很好的程序。现在看来,将项作为单元进行处理,按层次梳理出幂函数项、常数项等,每一小块均实现求导的接口,最后再进行整合应该会让程序拥有更好的可扩展性并且更易维护。然后经历了第一单元的作业,我对面向对象的理解变得更加深刻了。
第二单元
第二单元的主要内容是多线程电梯调度。我的基本架构就是电梯,调度器和输入队列了,处理好不同线程之间的同步关系,也还算比较顺利。这一单元遇到的主要问题就是线程同步与线程安全了,需要了解死锁产生的条件如何消除死锁以及如何避免死锁的产生。同时我们还学习了多线程下很多经典模式,像是生产者消费者模式,对我们理解多线程的相关内容提供了很好的帮助。
第三单元
第三单元的主要内容是JML规格的理解和应用,这次基本架构官方都已经给出,我们只需按照JML要求来写代码即可。需要注意的是符合JML要求的前提下,我们也需要注意自己程序的设计。事实上这一单元是我做的最差的一个单元(理论上这一单元比前面的两个都简单),自己对要求理解的失误,对于图的相关算法未能去分辨性能差异导致我有点凉凉,这也给我敲响警钟,需要弥补在算法方面的短板,同时更加在保证正确性的情况下多多寻找提高性能的方法。
第四单元
第四单元的主要内容就是UNL的解析了,具体架构前面已经说了,总体的感觉就是交给你一堆数据,告诉你它们之间有着这样那样的关系,要你去筛选、分析、处理、整合这些数据以方便查询相关信息。当然,通过本单元的学习我们也对UML的结构有了更加深入的了解,UML作为很有帮助的工具,也可以在我们以后编写程序的时候派上用场。
三、四个单元中测试理解和实践的演进
第一单元
第一单元基本测试的方法就是手搓数据了,针对一些边界或者特殊的数据定点测试。事实上正确性还是可以保证的,主要对性能的优化方面需要多加考虑。
第二单元
第二单元多线程的测试还是挺困难的,我基本就采用了print大法了(确实了解每一步在干啥),部分同学也采用了python,但我学艺不精所以没有采用。
第三单元
第三单元接触了junit单元测试后我也采用了一下,junit单元测试更见方便易用,就是想要覆盖测试需要耗费很大的人力。并且不容易测试到我的性能问题,而我很大的bug在性能上,这时候和同学对拍可能是更好的选择(但没有人和我对拍),更容易发现问题。
第四单元
第四单元的话没什么好说的,就测完样例后在staruml中针对测试手动画几个图考虑特殊情况来测一下就可以了。感觉综合来看这几个单元我的很多时候都是形式化验证和简单的测试一起进行,实际测试的效果很大程度上取决于我自己的理解,万一我理解出问题就炸了,我要多多和同学合作,集思广益或许是更好的做法。
四、课程收获
本次课程的收获还是非常大的,掌握了java语言的部分知识,拥有了初步面向对象编程的思想方法,在设计程序时也会很注重程序的架构、可扩展性和性能,在设计一些内容较多、功能复杂的程序也更容易逐步理清思路,分层次设计。也掌握了junit单元测试,UML图等有力的工具,让我之后编程的时候更加得心应手。
五、课程改进建议
总体感觉咱们的课程设计还是挺不错的,就是难度方面先难后易有点奇怪(可能是我变强了?)。
1、我觉得我们可以先从JML规格开始,让大家学习官方代码更容易入门,也就不会在第一单元还不太懂的的时候疯狂重构费心费力了。
2、还有课程的学习的目标肯定是希望我们同学能够掌握更多的知识,所以我认为在一单元结束之后我们可以请设计优秀的同学来谈谈自己的设计过程,大家集体讨论,向他们学习,这样可以让同学们集体进步,而不至于差距越来越大,有时只看他们的部分代码我感觉我有点理解不来。
3、实验课真的不可以上完后公布答案吗,我做完之后不知道正确与否确实挺困扰的,害怕影响之后的学习。
六、线上学习
其实线上学习总体感觉是不如线下的,和老师的互动有点生硬,和同学讨论也很麻烦。但好处在于学习的课程可以反复看录播,老师助教们也很贴心的开设讨论区让我们学习,也算弥补了一下吧。最后的最后,在OO的最后结束博客,我还是要感谢辛苦付出一学期的老师和助教,给了我们很大的帮助,我们又是收获满满,希望OO越来越好。
浙公网安备 33010602011771号