OO第四单元总结

OO第四单元总结

架构设计

本单元的架构设计较为简单,如图所示:

在第一次作业中将所有方法的实现放在一个类MyImplementation中,在第二次第三次中由于加入顺序图和状态图,为了防止代码超出500行,因此将类图、顺序图、状态图的读入与查询分别放入了MyUmlClassModelApi、MyUmlCollaborationApi、MyUmlStateChartApi中,三个类同时读入传入的elements数组,通过switch-case分类存储各个类中所需的UmlElement,使用ArrayList或Hashmap保存,读到不需要存储的元素直接跳过。对于读入的UmlAssociation等关系,我先将其存入ArrayList中,待全部读入完毕后统一遍历处理各种关系,防止加入关系时对应的类还没有读入。

对于UmlClass、UmlInterface等元素,直接使用时对某些功能的实现较为困难,因此使用一层MyClass、MyInterface等封装这些元素,存储一些需要用到的数据。如MyClass中存储了对应的UmlClass、子类subClass、父类superClass、实现的Interface以及对应的attribute和operation等。对UmlOperation、UmlClass、UmlInterface、UmlState、UmlStateMachine、UmlInteraction都进行了自定义类的包装。

架构设计思维及OO方法理解的演进

第一单元

第一单元的主要内容为表达式解析。由于预习没有做到位,在做作业时感觉到很吃力,对于java的容器、语法等都不太了解。因此第一单元主要让我熟悉了java语法以及各种容器的使用方法,使我能够选择相对合适的容器来储存数据。递归下降方法的使用让我初步学习到了面向对象的层次化设计,对数据进行分层处理,既高效又使得架构非常清晰。同时也对面向对象的继承和多态有了一定的了解,初步学习了面向对象的知识。

第二单元

第二单元的主要内容是多线程电梯调度。有了第一单元的铺垫,第二单元让我逐渐进入了状态。作业架构采用生产者消费者模式,将Schedule类作为托盘,把请求队列中的请求放入对应的电梯等待队列中,并且将请求分类送入横向电梯和纵向电梯。在架构设计中我体会到了面向对象的单一职责原则,将等待队列交给对应的电梯处理而不是在策略类中维护。合理的架构设计让我在第二单元的学习中顺利不少。

由于第二单元为多线程设计,在debug中我也对线程和加锁的理解逐渐加深,学会了避免死锁和轮询的产生,保证线程安全。多线程的数据共享也让我在画UML类图时对类之间的关系的理解进一步加深,不再像第一单元一样对关联、依赖等关系一知半解。

第三单元

第三单元的主要内容为契约式编程。契约式编程的主要难点在于理解JML规格并依照规格写出正确的代码,对架构设计要求不高,只要实现官方包提供的接口即可。掌握理解JML规格能够让我们的程序减少很多架构设计以及方法设计上的问题,提高正确性。

第四单元

第四单元的主要内容为UML解析,在实现解析器的增进了我对类图、协作图以及状态图的了解。架构设计也较为简单,主要应用了代码封装的思想,通过自己实现的类来封装元素,可以存储更多需要用到的数据,使具体方法的实现更加便捷,对代码的层次化设计理解更深了。在具体设计的同时,我也感受到类图、协作图以及状态图在具体解析上差别并不大,本质上是类与类之间的关系以及类中元素的各种属性,体现了UML图的统一性。

测试理解与实践的演进

第一单元主要依靠手动编造数据,效率以及效果都很低。第二单元通过手动编造特殊数据以及在需要测试的点前后打印信息来测试,在多线程编程的测试中较为有效,找出了一些线程安全上的bug。

在第三单元中由于需要输入大量指令,因此主要采用了通过python随机生成测试数据进行测试,并且可以人为调整随机数据和边界数据,使得代码bug大大降低,测试效率较高。与此同时也尝试了Junit工具来测试,但是效果不是特别理想。

第四单元用python随机生成数据不太容易实现,因此还是使用了手动设计了UML图进行测试,效果也比较好。

课程收获

在OO课中最重要的收获就是学习了面向对象的思维方法,从最基础的继承、多态到代码的层次化架构设计、代码的封装,让我的编程的思维方式发生了转变,不再拘泥于传统的面向过程的思维方式,让我逐渐重视起代码的架构设计而不是具体的实现。我还提高了多线程编程的能力,学会如何避免轮询、死锁的产生,在合适的地方加入锁来保证线程安全。对JML规格的理解与掌握提高了我的思维能力以及代码编写的正确性,学会使用正确的规格写出正确的代码,在遇到一些可以预期的错误时抛出对应异常。我还掌握了UML图的绘制与解析,理解了UML模型各元素的作用以及特征,并且学会使用UML类图分析代码架构。

本学期OO课程的学习也让我对于java语言的运用变得熟练起来,从一开始的毫无接触到如今熟练运用基础语法以及容器,我的代码能力得到了显著的提高。第三单元的某些指令的实现也训练了我的算法能力,学会使用java语言实现一些基础的算法。并且还学会了多样化的程序测试方法,不再是简单的手动构造数据。

尽管做每周作业时都很痛苦,但课程带来的收获却是非常丰富的,让我感觉到我的面向对象思维以及代码能力相比之前有了质的飞跃。

改进建议

1.希望每次实验课在评测后能够给出具体的评测结果。没有确定的评测结果让人有一种做完实验就扔掉的感觉,对实验的重视程度较低,也不方便根据在实验中学到的知识或遇到的问题来改进自己的代码。

2.第二、第三单元的中测可以稍微提高一点强度。由于第二单元多线程具有不确定性,debug比较难,很多线程安全问题不易发现;而第三单元由于指令数量较多,一些边界数据也比较难构造,因此常常出现过了中测但强测分数很低的情况。

3.Pre的内容可以增加一些四个单元的基础知识。目前的Pre内容比较简单,是一个对于java语法以及面向对象的入门,但并不是课程作业的入门。Pre的内容和难度与第一单元相比差距太大,让人做作业的时候有点措手不及,不知道从哪里下手。因此可以将四个单元的基础知识放到Pre中,即使不设计成题目也可以将相关资料下发,让我们对接下来的课程安排有一个比较清晰的了解,并且有一个确定的学习方向。

posted @ 2022-06-26 20:11  JcDt  阅读(11)  评论(0编辑  收藏  举报