北航oo第四单元博客作业

北航oo第四单元总结

本单元作业的架构设计

UML类图

 

 

 

 

 

 

 架构设计

  • 使用了代理模式,从UmlElement中将一些比较关键的元素提取出来,包装成了新的类,这样做的好处主要在于可以在目标对象实现的基础上,增加了额外的功能操作和额外的一些属性。例如MyClass类就代替了对应id的UmlClass,并且还包括了对应类的所有子类、实现的所有接口、所有的操作和属性,这样在查询类相关信息的时候便直接调用MyClass类已经定义好的方法即可,非常的方便快捷。
  • 容器使用的基本上都是HashMap,考虑到需要同时满足查询时根据名字获取相应元素、对官方包中元素进行提取时要通过id来建立起各个元素之间的关系和一个名字不能对应多个类这三个需求,对于各个My*类我都用了三个HashMap来存储相关的信息,一个HashMap记录了名字-名字对应元素数量键值对来判断是否重名,一个HashMap记录了id-My*类键值对来根据id获取相应元素,还有一个HashMap记录了名字-id键值对来根据名字获取相应id。三个HashMap的配合使用便可以满足上述三个需求,可以快速地查询、对官方包元素进行解析和判断是否重名。
  • 整体框架上主要是分为了三个部分:UML类图、UML顺序图和UML状态图。UML类图部分中包含MyInterface类、MyCLass类和MyOperation类,实现了关于UML类图的查询功能;UML顺序图部分包含MyCollaboration类和MyInteraction类,实现了关于UML顺序图的查询功能;UML状态图部分包含MyStateMachine类和MyTransition类,实现了关于UML状态图的查询功能。
  • 对于一些比较复杂的查询功能的实现,如状态图中关键状态的查询、类图中耦合度的查询等,我都是通过dfs算法实现。虽然每一次进行dfs的复杂度都比较高,但是在官方包中的元素进行提取完毕后,就可以直接对每个状态图进行dfs,将关键状态保存下来,查询的时候便只有O(1)的时间复杂度,最后总的效率依然很高,不会有超时的问题。

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

我认为oo课程的每一单元都非常地有特色,各个单元有各个单元侧重的地方

  • 第一单元:第一单元需要我们对表达式进行拆分,拆分成表达式、项和因子,并且对建立起对应的类,算是初步的面向对象的设计。但是在第一单元时我的编程能力还相当薄弱,也没有接触过面向对象的程序设计思维,因此完成地相当艰难,幸好有训练题、实验课等的帮助,让我初步建立起了面向对象的思维模式,最后虽然过程比较痛苦,但也是一步一步地完成了第一单元的所有作业。
  • 第二单元:第二单元的特点就是多线程程序的设计,需要我们对各种不同的电梯建立不同的类,同时还需要考虑调度器、调度策略、线程安全等等许多问题。但是通过第一单元的训练,第二单元完成起来也就没有那么痛苦了,只要根据各个对象的特点建立起相应的类,再选择好合适的调度算法便能够完成主要的架构。剩下的就只需要考虑线程安全的问题,在第二单元中我对共享的对象和方法都加上了同步块,因此也没有遇到过线程安全方面的问题。我感觉第二单元是让我们对面向对象的方法具有更深的理解,并且让我们初步接触多线程程序的设计。
  • 第三单元:第三单元的风格感觉和前两个单元有所不同,第三单元中我学到了JML规格语言和契约式编程。在这一单元理解JML的用意,并且选择合适的算法进行实现是最关键的。这一单元编程的难度其实并没有前两个单元那么高,但是要求我们设计出高效且符合要求的程序。
  • 第四单元:第四单元我感觉其实和第三单元有点类似,要求我们学习UML模型,并且完成一些对UML模型进行查询的指令。这一单元主要需要我们对官方包中的各个Uml元素进行提取并建立起它们之间的关系,提取完各个元素建立起基本的架构后再进行查询指令的实现就能够更加地简洁高效。

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

  • 第一单元:第一单元的测试我主要是通过了Python来生成随机的表达式,并且通过Sympy库来进行比对判断结果是否正确。并且比较重要的一点是构造边界数据来进行测试,第一单元中边界数据是比较容易出错的一个地方。
  • 第二单元:第二单元由于是多线程的程序,因此测试起来其实比较麻烦,我主要是人工地构造数据,测试线程是否安全,当乘客数量很大的时候各个电梯能否有序地运转。还有一个测试重点是测试调度策略是否高效,能否在限定时间内将乘客全部送达。
  • 第三单元:第三单元主要是要将每个指令都测试到,需要提高数据地覆盖率,并且重点测试一些复杂度比较高的指令,避免超时。
  • 第四单元:第四单元测试策略其实和第三单元差不多,也是测试数据要尽可能地覆盖到各个指令,并且要保证不能够超时。

课程收获

在这学期的面向对象课程中我其实收获到了很多,最重要的我觉得是代码编写能力的大幅提升和面向对象思想的培养。

首先是代码编写能力的大幅提升,因为高工的编程训练一直都是比较少的,可能是为了给各种数理课程让路,不论是大一的C语言课程还是大二上的数据结构课程,让我们编写的程序都是比较简单的,代码量也很小,因此一直以来我感觉我的代码能力都非常薄弱。但是这学期的oo课程每周都有一个大作业,大作业的ddl还非常紧迫,代码量也相当之大,因此在本学期开始我过得是非常痛苦的。当然也多亏了oo课程的培养,经过了前几次的作业训练后,在代码编写上我也是越来越熟练,作业完成的也比较得心应手了,最后整个课程下来,能够明显地感受的代码能力的大幅提升。

其次是面向对象思想的培养,我觉得这应该才是我们这门课的核心。我认为面向对象和面向过程的思想有着本质上的区别,作为面向对象的思维来说,当我们拿到一个问题进行分析时,分析的不是第一步先做什么,第二步做什么,这是面向过程的思维。而是应该分析这个问题里面有哪些类和对象,然后再分析这些类和对象应该具有的哪些属性和方法,最后还得分析类和类之间的关系。

总的来说,这门课每周能够让我有着新的收获、新的进步,一学期下来也是完全能够感受到自己有着很大的提升,这学期过的非常充实。

三个具体的改进建议

  • 首先可能是我原本的编程能力就比较薄弱,所以在pre课程到第一单元课程中还是感到比较地吃力,所以希望课程组其实可以再稍微提高以下pre课程的难度,这样过渡到第一单元可能不会那么地吃力。
  • 第二个建议就是其实感觉每个单元的第一次作业才是最难的,后面两次作业都只需要在第一次作业基础上进行迭代开发,就会比较简单。而第一次作业要从0开始设计一个架构,感觉是非常吃力的,课程组如果能够让三次作业的难度曲线更加平滑一些就更好了
  • 第三个建议就是弱测的时间如果能够早一些开放就更好了,从周一到周四整整三天的时间感觉会有点长。
posted @ 2022-06-25 14:17  瓜子猫  阅读(39)  评论(1编辑  收藏  举报