OO_Unit4&End总结
一、本单元作业架构
1.1第一次作业
本次作业最终需要实现一个UML类图分析器,可以通过输入各种指令来进行类图有关信息的查询。
为了实现数据结构的构建,拓展了Opereation,Interface和Class,建立了新的类。在MyUmlInteration中使用一些Hashmap,Arraylist等结构来储存读取的各个元素,通过包含、继承、实现和关联关系构成图。由于数据输入不保证次序正确,需要分两次遍历获取的数据,第一次遍历对元素分类后存放在不同的容器中,用以后续按id查找,第二次遍历确定元素间的关系并将其组合,构建起图的结构。虽然说本次作业不建立完整的结构也可以用其他办法实现要求的功能,但是优秀的架构更利于后续功能拓展。
1.2第二次作业
本次作业在上次作业基础上扩展解析器,使得能够支持对UML顺序图和UML状态图的解析。
相比第一次作业因为不熟悉Uml而花费较多时间摸索和设计架构,本次作业要轻松一些,只需要按照相似的思路进行功能拓展,第一次作业的代码可以完全复制下来。类似的,在原有UmlState的基础上建立新的类以构建图结构,在MyUmlGeneralInteration中用几个HashMap进行元素的保存和索引。
1.3第三次作业
增加了对模型进行有效性检查。
代码量随着功能扩展有所增大,为优化交互类过于庞大的结构,设Manager类来管理数据。本次作业没有新增数据,因此可以保持原有的结构不变。对于新增的有效性检查需求,针对性地添加了相应的功能,原来忽视的元素比如UmlAssociationEnd等本次作业中补充了额外的操作。如果能够将不同的接口单独实现,在交互类中调用其方法,会使得整体结构更加合理,避免了一个类中代码过多,功能混乱的情况。但是开始没有注意到这点,而且迫于复习压力,没有实现这一想法。关于算法,主要需要注意循环继承、重复继承和实现的判断,避免出现超时、死循环或栈溢出的错误。
二、四个单元中架构设计及OO方法理解的演进
2.1第一单元
第一单元主要是对表达式的解析和求导,也是在熟悉java,对于面向对象的思想有一个初步了解,并让我们从面向过程的思维中跳出来。这一单元的难点可以概括为对多项式的读入与识别,由于面向过程的惯性思维,使得这一点上的转变比较苦难你,由于刚刚接触OO,对其思想还不是很熟悉,甚至JAVA也没有掌握,第一次作业基本就是面向过程,经过学习别人的思路,第二三次作业这一情况才算是有了好转,正式踏上面向对象的道路。
这一单元是比较痛苦的,由上述原因,将面向过程的思想堆积到了一个java文件里,复用性与可扩展性都很差。经历了两次整体重构才构建起表达式树,慢慢有了成形的架构设计。这单元第三次作业对我来说大概是难度巅峰了。
2.2第二单元
第二单元主要是从多线程的起步到精通,难点在于初步接触线程需要学习的东西很多,而且还要注重调度策略的优化。如何尽快完成任务,并且避免线程冲突是最主要的问题。尤其到了第三次作业,多个电梯如何较快且不冲突调度,调度器如何设计和分配功能。从单线程到多线程,多线程概念多而且难以理解,在上手前学习理论知识用了很多功夫。吸收上一单元反复重构的教训,这单元在一开始我就深思熟虑了架构设计,在理解了线程知识后前两次作业还算顺利,有所遗憾的是没有采取更好的换乘策略,用数学方法计算最佳的调度方式,因而在性能上可能还有较大的提升空间。
2.3第三单元
第三单元围绕JML展开,在理解了JML规格后,这单元作业相对就好理解了,本单元的代码量要比前两个单元小很多了,但是最终结果却不见的比前面好,对于JML作用和定位的理解有所偏差。此外,契约式编程的学习让我对不同编程者之间的沟通有了新的认识,了解了调用者和被调用者如何配合使得程序完美运行。
但是仅仅完成JML规定的部分并不能满足测试,性能优化上仍需努力,也要注意自己构建高效的架构。也就是说JML并不是这单元作业的绊脚石,算法设计才是,这单元我也捡起了数据结构的一些知识和算法,才算是勉强过关了。
2.4第四单元
第四单元是解析UML图,难度也不大,其重点在于理解UML图的构成,在较为深入的理解类图、顺序图、状态图后才能较好的完成这次作业,在代码架构上,私以为难度并不大。但是关于UML类图/状态图/顺序图的理解,starUML中的细节,JAVA中的继承实现机制等等细节问题要求较多。
也有复习压力的因素,这单元作业没有太深入钻研,基本上完成任务就结束了。主要是对uml规格的理解有了提高,能够帮助我更好的组织程序架构。
三、四个单元中测试理解与实践的演进
第一单元由于不熟悉java语言和面向对象的思想,产生了不少bug,初期我的测试思路也不完善,导致互测阶段被hack不少bug。互测中我发现的bug并不太多,一部分原因在于没有搭建出良好的评测程序,造成测试效率不高,主要的测试思路有这些:无脑使用数据生成器,生成覆盖功能较广的数据,进行黑盒测试,以快速找到bug;结合自己完成作业时的情况,尝试容易犯下的错误和边界值;阅读对方代码,从代码逻辑上找出错误。
第二单元测试难度比较大,刚接触线程连如何调试都不知道,还要构造测试程序在相应的时间投入数据,比较适合对拍,用随机生成的一些请求进行测试。测试思路上还是延续第一单元,形式和测试方法有很大不同,需要学习和适应。
第三次作业是JML规格,认识了JUnit插件,可以自动生成一些边界条件上的测试用例,但是实际使用下来也只是进行了简单的功能测试。然而TLE才是这次作业最大的问题,构造压力测试很重要,特别是中测和强测差距较大,中测甚至测不出基础问题,是不应当依赖官方评测机的。
第四次作业是UML图查询和检验,需要构建覆盖较广的测试样例,其实情况比较少,也很容易检查bug,查明原因。
四、课程收获
要说最大的收获,那当然是对面向对象程序设计思想的理解和运用了,这一点贯穿了整个课程四个单元,每一个单元,每一次作业都能让我加深对面向对象的理解,给我们提供了程序设计的一种全新视角,如何通过抽象的方法形成层次关系,描述一切事物,不仅仅是一种技术,更是一种思想。
无关图片
此外,我也通过这学期的学习掌握了基本的Java语言知识,课程中对于Java语言本身的教学内容并不多,遇到了问题更多是自己上网查找资料,通过各种文档和博客,逐渐强化了使用Java的功底。对于多线程编程有了较深的理解。多线程问题需要我们使用合适的设计模式,对各线程间的同步、互斥有深入的理解,全面和仔细地分析协作是如何进行的。对JML的学习让我对契约式编程有了深刻的理解,这样一门技术是有必要的相信会在实际开发中使我受益。而UML通过可视化的图形形式,帮助开发者对大规模、复杂系统进行建模,这对于设计面向对象的架构具有重要的意义。通过对UML文件的解析,得以深入了解各种元素的结构和组织方式,以及检验模型有效性的原则,在这个过程中对面向对象语言的特性也有了更深的理解。
五、改进建议
1.从上面的阐述也可以看出,测试在OO实验中是比较重要的一环,然而这一部分却没有给出太多指导,特别是前两单元完全一头雾水,靠着大神们的讨论才了解什么是评测机,怎么对拍多线程等,本来就不多的作业时间还要拿出来学习如何测试。课程组如果能在这方面给出更多的指导,相信会起到很好的效果。
2.在第三单元JML实验中,应当是学习重点的JML没有占主导地位,优化算法成了作业的一大难关。当然这其中也有我水平太低的因素在,但是这单元给我的最大体会就是如何想方设法减少cpu时间,似乎有点本末倒置,希望算法要求不要太苛刻,或者针对算法进行专门训练。
3.希望能够看到更多大佬的具体的思路和设计,总有一种闭门造车的感觉,一直按照自己的想法难以提高。
六、线上学习体会