OO第四单元总结

第四单元总结

本单元主要针对UML类图、顺序图、状态图进行学习以及考察,相较于JML单元,感觉难度又提了些许,通过此单元,对UML的内容及解析知晓得更为深入了。

本单元架构设计

第十三次作业

本次作业,需要完成的任务为实现一个UML类图分析器UmlInteraction,学习目标为UML入门级的理解、UML类图的构成要素及其解析方法

架构设计

此为UML架构图:

本次作业运用分类的方式进行存储UML类图的各个参数变量,在一开始先遍历将所有element进行存储,后建立operationclass等的存储器,其中存储了有关各种类型的容器。使用这种方法可以达到按需存取,且思路比较清晰。缺点是遍历次数较多。

容器选择方面,则大部分用的是HashMap<..,HashSet<..>>HashMap<..,..>等结构,由于id不存在重复,故element存储的键值为id,其余的则根据需要进行容器的建立,比如接口的继承,可以建立HashMap<UmlInterface,HashSet<UmlInterface>>的容器进行存储,从而达到方面存取的效果。

解析器的实现中,如类实现的全部接口需要用到深度/广度优先搜索算法,由于实现要求对于name或者重复有一定的要求,在进行此过程时所用的容器,需要根据情况在HashSetArrayList之间进行取舍。

测试及bug分析

此次作业主要出现的bug在于广度优先算法的实现出现问题,容器选择出现问题,导致漏或者重的情况,后根据自我以及同学构造数据进行对拍,课下问题解决。公测也未出现bug。

第十四次作业

本次作业,在上次作业基础上,扩展解析器,使得能够支持对UML顺序图和UML状态图的解析

架构设计

此为UML架构图:

上次作业即代表MyUmlInteraction类图分析,此次作业新添加了顺序图以及状态图的解析,则分别新建MyUmlCollaborationInteractionMyUmlStateInteraction进行处理。在上次作业的基础上,将各种类型的变量存储器并到了一个总的存储器——MyClassStore中,虽然使得这个类较为臃肿,但可以实现减少多次遍历的效果(各有好处,此单元采用了此种提升性能的方法)。

测试及bug分析

此次作业主要出现的bug在于状态图中的状态迁移,有关message的问题较为复杂,后根据指导书以及讨论区进行理解分析,问题得以解决。公测也未出现bug。

第十五次作业

本次作业,在上次作业基础上,对模型进行有效性检查

架构设计

本次作业在上次的基础上,增加了对模型的有效性检查,所以增加了一个MyCheckRule进行检查,其中各种异常类型理解较为困难,比如R001的属性和关联对端要放在一起考虑,循环继承可能有自环等等,实际实现比较复杂。

且由于模型检查的增加,之前类图的部分实现可能会出现问题,要将部分HashSet改为ArrayList进行处理。

测试及bug分析

此次作业主要出现的bug在于模型检查时有关问题未考虑全面,后根据同学的对拍数据,进行比较分析修复,问题得以解决。公测也未出现bug。

单元架构设计及OO方法理解演进

第一单元:主要是针对表达式求导的处理,是第一次接触java以及面向对象思想,开始架构比较丑陋,大部分思想还是面向过程处理,而第二三次作业则进行大规模重构,针对表达式的不同部分成分,进行递归下降的方法进行分类存储处理。

第二单元:主要是针对多线程,通过电梯模型进行学习。实际作业时,按职能进行分类,电梯只管运行,人员安排留给分配处理器进行处理。则可实现较为完备的处理,但由于自身对于ALS算法理解不是特别到位,导致后面电梯的调度算法既不像ALS也不像LOOK算法。虽然整体架构还行,但具体实现细节有很多问题。

第三单元:主要是针对JML规格进行学习。由于有大量官方的结构,所以整体架构很清晰。实现方面即按照官方规格进行一步一步理解实现即可,部分地方由于性能的原因,需要进行优化实现。

第四单元:主要是针对UML进行学习。个人是将UML各种类类型变量分类进行处理,并在迭代时,增加新的处理器进行相应处理,个人认为整体架构很不错。具体实现起来也很清晰明了,所以这个单元也是唯一没有bug的单元。

OO方法理解:对于面向对象的思想,一开始老师便大力强调,但奈何面向过程的思想难以瞬间改变,在一开始的作业中,面向过程的影子还是比较多的,所以后续出现了重构。在经历第一单元痛苦之后,面向对象的思想逐渐在代码中得到体现,后面每次设计都会从分类的角度进行分析,从而简化整体的逻辑,达到化繁为简的效果。而第三四单元官方的架构也让我了解到了更为优秀的设计架构。现在也基本懂得运用面向对象的思想,进行问题的思考以及处理。

测试理解与实践的演进

第一、二单元:表达式以及电梯方面,由于个人自身的原因,未实现自动测试的程序。大多数测试都是自己根据指导书,进行边界或者覆盖性手动测试,所以测试效率很慢,且难以保障到测试的全面性。而这两个单元的测试结果的正确性判断,较为复杂,较多时候是通过简单的目测判断或是仅仅根据是否超时进行判断,所以测试是很不充分的。个人这方面能力有待提高。

第三、四单元:这两个单元,由于官方包的存在以及诸多输出限制,正确性判断可以较为容易地实现,这两个单元则大多是根据与同学对拍数据进行测试。

课程收获

首先,对于这门课程,个人整体感受是既折磨又受益匪浅。

从一开始的完全不会,甚至想过坚持不下来这门课程,到一步一步摸索java的各种语法、细节实现,以及学习面向对象的思想,再到最后也能较为完美完善地完成整个OO课程。整个过程,一言难尽。基本每周都有作业,作业有中测、公测、互测、bug修复等等。高强度的训练节奏,虽然在一开始让人很折磨,但当后续习惯后,总的写起来,就比较适应且没那么难受了。

知识方面,通过四个单元的学习,了解到了java这门语言的特性以及使用方法,第一次接触并学习了多线程,了解了JML与UML相关的知识。单从这一方面来看,总的收获已经很大了。课程的学习经历不可谓不丰富。当然这当中最重要的还是面向对象的思想,从开学一直到最后,无论是实验、作业还是理论课程,所有的一切都是贯彻这一条思想。对于这一点,我不能说已经完全熟练掌握,但至少可以尝试并能够较为独立的运用此思想解决许多问题了。单从这一点来看,已经是有很大的收获了。

整个学习的过程,当然离不开助教以及老师的帮助。总的来说整个OO课程,虽然历经千辛万苦,但最终还是修成正果,还算满意。

改进建议

首先是作业方面,个人感觉在OO的pre预习方面,可以多给一点知识性的教导,虽然让我们自主学习,可以锻炼自我的能力,但这个过程确实很痛苦,如果能有多一点详细一些的指导,估计第一单元的作业,也会显得更为“友善”一点。

其次是作业指导书方面,前两个单元还好,对应现实实际生活内容以及所学内容,理解较为简单,不易出现理解困难。但后面两个单元JML以及UML的学习,许多新概念的出现,导致部分概念理解有所偏差,且有些容易混淆的地方感觉可以在指导书上有所强调(比如UML一章最后模型检查的一些问题),但并没有。这样在讨论区进行问答时,既消耗了了学生的时间,也增加了助教的负担。这一点估计可以加以改进。

还有就是实验课和训练内容部分的内容,有时候会出现内容滞后或者过于超前的情况,感觉可以将一次多量的训练拆成针对性的几次可能比较好。

最后就是讨论区的设计,感觉可以参考计组、OS讨论区,回复下面可以还有针对回复的回复,那样看起来可能更加舒服。

posted @ 2021-06-26 16:06  枭丶  阅读(45)  评论(0编辑  收藏  举报