BUAA_OO第四单元&&课程总结

OO第四单元总结&&课程总结

摘要

本单元三次作业不断迭代,最终实现一个扩展 UML 解析器,使其支持对 UML 类图、状态图和顺序图的分析,可以通过输入相应的指令来进行相关查询,并能根据 UML 规则进行一定的规范性验证。

本单元作业的架构设计

第一次作业

根据UML图的依赖层次,读取时将类元素分成三层,通过三次遍历分层读取:

  • 第一层:Class, Interface,associationEnd
  • 第二层:Attribute, Operation, Association, Generalization, InterfaceRealization
  • 第三层:Parameter

除了MyImplementation,自己新建了MyClass,MyInterface,MyOperation类,便于后续的存储和解析。

本次作业共有对类图的8个指令,每个指令都是在MyImplementation类中预解析时进行了预处理,并用相应容器存储预处理的结果,当调用查询指令时直接从容器中返回已经提前处理好的,从而降低时间复杂度,是用空间换取时间的策略。对于同时涉及子类和父类的查询指令,如类的继承深度、类实现的全部接口,采取递归DFS的写法。总体来说,读懂题目的定义,理清UML的结构再写就不算困难。

UML类图
image

第二次作业

新增对时序图和状态图的解析,虽然其中多出了许多元素,但在理解其结构和作业需求后,发现可以在第一次作业的基础上继续完善预解析部分即可,解析顺序为:

- UmlClass
- UmlInterface
- UmlAssociationEnd
- UmlAttribute
- UmlGeneralization
- UmlInterfaceRealization
- UmlOperation
- UmlAssociation
- UmlParameter
- UmlStateMachine
- UmlRegion
- UmlState
- UmlFinalState
- UmlPseudostate
- UmlTransition
- UmlEvent
- UmlInteraction
- UmlLifeline
- UmlMessage

UML类图
image

第三次作业

新增了模型有效性检查。本次作业理清结构,决定好存储层次后,按部就班完成即可,不涉及复杂的算法,但是需要细心,很多地方容易出小错误。

我新增了DataBase类和PreCheck类,DataBase类用于存储之前在MyImplementation类中的所有数据结构,DataBase采用懒汉单例模式,所有的初始化与预处理方法也写在DataBase类中,PreCheck类用于有效性检查,也是一个单例模式的写法,其中有9个check方法对应9条预处理指令,PreCheck类类似一个工具类。

其余结构未变,故不再放UML图。

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

第一单元

表达式化简模块虽是OO课程的入门模块,但其含金量还是比较高的,加上其中许多化简的细节使本单元的难度再次提高。第一单元强调层次化、对象化编程,纠正我们之前面向过程的编程思路。我们需要在表达式、项、因子等各个元素的异同进行模块化设计,新建Parser类采用递归下降的方法进行各个模块的生成。对于第一次接触面向对象思维的入门者来说还是需要在作业中花很长时间才能认识到这些思想,三次作业虽然痛苦,但也让人受益匪浅。从第一次作业之后,我也开始逐渐理解设计的重要性,科学的设计将会让之后写代码的过程如鱼得水。简而言之,第一单元让我对面向对象的理解就是模块化和层次化,建立模块的原则是求同存异

第二单元

本单元主题是多线程,强调对象的运行时行为状态与并发控制保证线程安全。本单元需要更加注重架构设计,对于设计模式、调度器、电梯的职能等各处都要自行调节寻找平衡点。我的架构采取了两级生产者-消费者模式,电梯无论横向还是纵向只负责运行与开、关门,对于人的分配交给调度器,输入线程只负责将人的Request放到等待队列中以及接收到结束信息时对调度器线程和电梯线程setEnd。

本单元是第一次接触多线程编程,需要提前学习多线程相关知识并掌握Java多线程的写法。此外,线程安全永远是多线程的核心,要保证线程安全,要从设计阶段就做起,这也是本单元最耗时的地方。OO方法的理解就是:保证每个对象各司其职

第三单元

本单元主题是:规格化的面向对象设计。整体架构已由课程组给出,不需多考虑架构问题,主要考虑的是效率问题,需要重温一些算法引入一些Cache。

本单元对OO方法的理解是:

  • 代码的逻辑是可以用离散数学中逻辑部分的知识做表述的,规格化设计也是一种保证和预测代码正确的常用方法。
  • 面向对象的思想要有算法和数据结构知识支持才能完美地完成一次任务。

第四单元

本单元的主题是:模块化设计与模型管理。UML本事是一个强调层次管理的对象,设计时要分门别类建立模块,并对应模块化方法。本单元加深了我对“对象”的理解,让我深度了解UML图的同时重温前面单元的设计思想。

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

我采取的测试方法主要是:手动构造特殊边界数据以及数据轰炸+对拍

我认为这两种方法比较高效。前两单元采取的方法是手动构造特殊数据,但两个单元手动构造的方法并不能保证把所有特殊情况都测一遍,这也是自己会在强测中出bug的主要原因。后两个单元则主要用大量数据来轰炸黑箱测试,这样找bug的效率较高。

当然,要像代码少出bug,最重要的除了要有许多经验积累外,还是要在设计阶段多花时间认真思考,写代码时理清逻辑,思路清晰、步步为营。写代码时边写边测试,不要想在最后写完再一起测试,这样就像亡羊补牢还是太晚。

课程收获

  • 思想上,有了用面向对象的方法思考问题的角度,在一次次作业实践中更加深刻的理解了面向对象的三大特征:封装、继承、多态。面向过程、面向对象两种思维方式都有其存在的价值,今后也要一直牢记,努力参透、正确应用;
  • 在设计、迭代、测试方面都有了前所未有的新认识,四个单元的作业都是迭代设计完成的,没有出现重构,我也明白了好的设计对一个项目工程的可维护性、可拓展性的重要性。
  • 编码能力上的提升:OO课是我第一次用java语言写代码,相比C语言它显得更加高效,C语言里需要自己编写的数据结构和函数在JAVA中都可以通过调用现成API实现。因此,每周写出千行代码在OO课后也不算啥事了。
  • 相关工具的使用更加熟练。git、markdown.IDEA都十分熟悉了
  • 与同学有了更多交流。除了大佬云集的讨论区,身边的lz,wzy,zzy,cyw等同学的热情分享也帮我扫清了许多困难,让我在繁重的课业下感受到分享的温暖

改进建议

  • 寒假预习的内容可以丰富。可以在寒假预习阶段加入各种测试方法的介绍与实践。寒假中将对整个课程的形式,要讲的内容、四个单元的内容等提前告知学生。个人感觉只学习了java的简单语法,开学来前几次写代码作业时还是容易摸不着头脑;
  • 每个单元的训练作业存在感需要提升。可以适当提前训练作业和答案下发的时间,帮助同学们在拿到作业指导书第一时间就可以有一个训练的代码例子作为提示;
  • 理论课讨论了许多概念、设计、思想在没有充分的实践前都还是只能做到有个印象,具体实现细节等理论课上讲的还是过于简单。理论课或许需要增加一些亮点。

OO课是至今体验不错的基本课之一。体系的完备、作业的递进,都让我感觉到了课程组的付出,写完博客,大二的生活也将画上句号,感谢OO,为我的大二生活添上鲜亮一笔!

posted @ 2022-06-28 23:15  BruceHimself  阅读(18)  评论(0编辑  收藏  举报