OOUnitFourSummary

OOUnitFourSummary

一、本单元作业的架构设计

本单元作业主要是UML类图、时序图以及状态图的分析,以实现一些查询功能,而且后续还需要对于一些错误的形式进行检测。本单元的整体构建并没有太大难度,而且对于性能的要求也并没有太大,而难点主要是在于UML图的理解,在理解了UML图的基础上其实代码实现并不是很难,而由于第一次接触UML图,故而第一次作业也就是开始是最困难的部分,在完成第一次的基础上,后面的两次作业也就只是在一些理解细节上不到位可能会出现问题了。

由于本单元的数据是一次性输入,在结束之后并不会改变,而且只有全部数据输入之后才会进行数据的查询指令操作。因此我本单元的设计思路是用一系列的HashMap将各个指令所需要的相关数据进行存储起来,并在构造函数中完成这些HashMap的建立,这样就可以在每次查询的时候直接使用这些数据结构,可以避免以后查询时的反复搜寻,而且对于一些要可能需要个数判断的异常抛出的问题直接使用HashMap<String, ArrayList<String>>中ArrayList的大小即可判断。
因此,根据我的思路,采用了一个最简单的架构设计,即在我的MyUmlInteraction中的构造函数里面对于已经解析好的UmlElements进行遍历,判断其中每一个UmlElement的类型,对于不同的数据类型构建相关所需要的数据结构(主要是HashMap),然后通过这些数据结构实现该类所继承的各个方法,而最后一次作业的格式检查也可以基于构造函数所构建的数据结构进行处理。而这种将大量数据结构和方法放入同一个类中进行处理的架构看起来十分的简单与直观,但在数据类型与指令条数变多的时候就显得十分冗长,导致越到后面写起来越复杂,也因此我的类长度超过500,代码风格分直接炸掉。

二、四个单元中架构设计及OO方法理解的演进

在本学期的oo课程学习中,我从最开始根本不懂面向对象,整个程序只有一个main函数,到了后面会根据课程的需求自己设计一些类并实现一些方法完成要求,有了很大的进步。

第一单元

在第一单元的学习过程中,我才刚刚接触面向对象的思想,而且编写程序的能力也并不是很强,因此第一单元的多项式求导程序写的一塌糊涂,现在回顾当时的代码简直是不忍直视。第一单元基本都是每周的作业压得难以喘气,尤其是第一次作业的“万事开头难”,勉强才能完成弱测和中测,也没有考虑架构问题以及代码的可拓展性,这也导致了我第二次的作业直接进行了重写,而重写过后的第三次作业就得心应手很多。

第二单元

而第二单元的多线程电梯问题,也是耗费了大量的精力进行理解多线程这个对于我来说全新的东西,多线程一个很重要的问题就是线程安全,本单元的程序编写让我了解了锁的应用,为线程间的通信提供安全保障,而且学习了如何避免死锁的问题。第二单元的bug具有不可复现性,而且只要出现一次问题就说明代码存在错误,因此在debug的过程中也对于多进程代码的检测与debug有了更深入的了解。

第三单元

第三单元主要是JML格式化代码的补充,并不会涉及到太多的架构问题,因为基本上都是结构已经由课程组给出,大部分都是进行对于JML格式语言的翻译过程,最多是偶尔在原有的类中加一些需要用到的方法。只是需要注意的是,本单元对于性能的要求比较严格,不能对JML进行机翻,要用更好的算法或对于已有数据进行存储避免重复查找进行优化。这单元中我对于JML语言有了很深的了解,也为之后的多人合作及工业界代码编写打下基础。

第四单元

而第四单元的我们编写的代码部分架构也比较简单,主体结构都已经由课程组给出,我们只需要对于传入的UmlElements进行处理即可。但是对于UmlElements的解析需要我们理解Uml图的架构,因此在本单元的架构中主要学到了Uml图的架构层次,对于java的类和方法使用起来更加得心应手,也理解了更多Uml图中的元素以及图的一些算法。

三、四个单元中测试理解与实践的演进

第一单元

第一单元由于我实现起来就比较困难,因此留给测试的时间并不多,测试也都基本上是通过手动构造一些边界数据来进行,比如疯狂嵌套到最大长度的表达式或者一些特殊因子的组合情况,以及一些我在编写代码时发现的问题(例如我很多个1加起来就会超时)。

第二单元

第二单元多线程的数据也比较特殊,我基本上也是手动构造测试数据或是对于给定的数据进行增减改造,来对程序进行极为简单的测试。由于手动测试的限制,导致测试数据强度远远不够,也导致有很多bug没有测试出来,也让我认识到了手动测试的巨大缺陷。

第三单元

第三单元是JML格式代码的编写,我这次主要是通过构造随机数据并通过与他人的程序进行对拍来验证代码的正确性,但是对于性能的关注不够,导致出现了很多超时的问题。

第四单元

第四单元可以使用课程组下发的mdj文件并用课程组提供的jar文件转化为相应的输出,进行测试,而本单元的测试数据也比较难,因此测试也主要集中在这些数据以及其他人提供的数据,并与同学的程序进行对拍,但由于理解不到位还是有过一些特殊的数据更是通过同学间的互相交流才得以测试出来。

四、课程收获

本学期的oo课虽然令人十分痛苦,但是带给我的收获还是特别大的。

首先最重要的是我学习了面向对象继承、多态等的思想,从需求进行分析,需要什么类以及方法来实现需求,并要考虑作业架构的可扩展性,尽量在最小改动原有架构的情况下进行迭代开发,在此过程中,我越来越认识到架构的重要性。此外,每个单元的内容也都带给我很大的收获,我对于多线程有了初步的理解,并可以完成初步的设计;也了解了JML形式化语言,稍稍加强了算法能力;此外,我对于UML类图也有了更深的了解。
当然,本学期的oo课程也让我更深刻的认识到了“世上无难事只怕有心人”的道理,每单元开始的举步维艰,或是遭受迭代时重构的巨大工作量带来的心理冲击,但是每个周末都坐在电脑前,与同学积极交流,终于还是每一次都挺过来了,也让我有了不小的成就感。每单元迭代开发的几百行代码也是让我的代码能力得到一个不小的提升,可以说,oo课程发掘出了我不小的潜力,对我受益匪浅。

五、三个改进建议

首先,建议实验上机课程能够给我们提供反馈,公布参考答案,不然每次上机后也都不知道自己的答案是否正确,是否理解上还有不到位的地方。

其次,希望四个单元的难度更平滑一点,第一单元的难度稍微降低一点,对于我这种菜鸡太不友好,以及第四单元的工作量再减少一些,学期末既要写oo又要复习考试很痛苦(主要计院考试基本集中在考期前两周)。

最后,希望理论课能够更加贴合实验,在理论课上能够真正的学会更多有利于实验的知识,这样不仅有益于课下作业的完成,也能更好调动学生的积极性。

posted @ 2021-06-26 17:34  .Aatrox  阅读(56)  评论(0)    收藏  举报