北航OO(2020)第四单元博客作业暨学期总结

一、第四单元架构设计

1.第一次作业

  我在本次作业中设置了多个储存结构:Directory,ElementsInName,ElementsInId,Cache。

  Directory: 顾名思义,这是个目录结构,可以通过一个UmlElement的id来获得他的子元素(储存结构上的子元素)。之所以设置这个结构是因为这个结构是UML中最基本的组织结构,通过UmlElement的一些属性可以快速的建立起来。

  ElementsInName: 在这个结构中,可以通过一个元素的名字,获取所有同名的元素。设置这个结构的原因是由于第一次作业中多个查询语句都使用了元素名字来进行查询。

  ElementsInId:在这个结构中,可以通过一个id来获取该id对应的UmlElement。设置这个的结构是因为1.id是一个UmlElement独一无二的标识。2.id在很多元素(UmlElement)的属性中充当其他元素的引用。

  Cache:用来存储一些查询结果,以优化之后的使用。存储的结果具有以下特征:1.完全从头开始查询需要较大的开销,比如图搜索。2.查询的结果可能再之后被用到,比如查询类的属性中一个父类查询到的属性可以被他子类再利用。

2.第二次作业

  为了在第一次作业的基础上直接扩展,为每个图的解析实现了一个类:MyUmlClassModelInteraction,MyUmlCollaborationInteraction,MyUmlStateChartInteraction。

  设置公共的储存结构Directory,ElementsInName,ElementsInId用来给解析类提供查询方法。同时为每个类实现专门的Cache来保存对应类查询过程中产生的可缓存数据。

3.第三次作业

  在第一次、第二次作业的基础上,大部分检查都不是特别复杂。主要的工作量在于R002-R004。

  R002: 使用tarjan算法得到双连通分量,如果存在多顶点的双连通分量,以及单顶点但有自继承的双连通分量,则存在循环继承。

  R003、R004: 每次从入度为0的根节点开始bfs,每次搜索过程中,被重复访问到的顶点即存在重复继承或是重复实现问题。

二、架构及OO方法演进

1.第一单元

  第一单元是表达式相关。这一单元给我留下较多印象的就是对正则表达式的使用,正则表达式在其中主要起到了两方面作用:1. 通过正则表达式匹配来检查输入的表达式是否符合我们的要求。2. 通过正则表达式来提取表达式中的不同部分以供处理。对于提取出的不同部分,抽象为不同对象来分别处理,算是面向对象的第一次尝试。

2.第二单元

  第二单元是多线程相关。这单元告诉了我什么叫架构的重要性,由于从始至终控制器都设置为了单独的线程以及一些其他的原因,导致总是有一些场景有复杂的多线程冲突问题,较大的增加了当时的工作量,同时也限制了控制策略的发展导致这一单元完成起来不是特别轻松。但在本单元中还是初步了解多线程的相关知识以及经典的生产者消费者模型。

3.第三单元

  第三单元是JML相关。重点学习了规格化设计思想(官话)。简单来说就是对着JML写自己的代码,由于各个方法的规格都已经有所限制,所以在自己的水平之内也想不到别的架构以及面向对象相关的内容。

4.第四单元

  第四单元是UML相关。总体还是在UML的理解上,就我自己来说这一单元倒是更接近面向过程了,除了几个储存结构,其他时候大致都是再思考如何实现工能,特别是第三次作业,更有点像是算法训练了。

总体来看,非要说自己的OO方法在几个单元的作业中不断演进有点不太现实。只能说在几个单元中分别从不同方向上初步了解了面向对象的思想,对面向对象有了一个大致轮廓上的了解。

三、测试理解与的演进

  惭愧的说,自己在测试方面的精力花费可以说是少之又少,从第一单元到第四单元,每次都只是写完代码后就几个点进行完一般的测试就过了,大部分时间都把测试的关键部分交给了和同学的自动对拍来完成(在此谢谢各位大佬)。但这种做法可以说是很不推崇了(但自己还是由于怠惰而选了这么干),偷懒往往只能使麻烦事晚点到来,所以还是希望自己以后能突破自己的怠惰吧(虽然很难)。

四、课程收获

  从大的角度来说,学习了java,了解了面向对象,提高了自己的编程能力。从小的来说,这种每周来一份作业且每份作业都需要较多精力的模式也锻炼了自己,培养了自己先思考架构再开始写代码的习惯。同时在平时与同学探讨问题以及在研讨课上听大佬分享都在一定程度上扩展了自己的知识面。

五、改进建议

1. 首先是课程作业与上课内容的联系。总说OO这门课好,但我认为是好在围绕着作业所构建起来的一整套体系,让我去回忆这学期学到什么时,我也只是记住作业相关内容以及在作业驱动下所学习到的知识。也就是说,我所认识到的OO这门课的优势在于每周一次的作业。而在这种以作业为中心的体系下,上课的内容却总是很少能和作业产生联动,不免会使得上课的内容被边缘化了,所以我认为是否能在上课内容上做出一些改变,增加其与作业的关联性。

2. 关与JML这一单元,一开始的想法很美好,希望在学习JML的过程中,通过利用JML相关工具链来提高效率。但最后只能说效果很差,在几个工具的配置上都没能得到很好的效果还浪费了较多时间。所以是否可以对工具链这一部分多做些介绍或是提供几个较为可行的方法来提高同学们对这一单元的总体感受。

3. 关与UML部分,实验课会专门要求对关联、依赖、组合、聚合进行区分,但课程组对这部分的介绍又难以帮助我对他们进行细致的区分,所以以后是否能在这方面进行更细致的区分。

六、线上学习体会

  与其他课程相比,我认为面向对象课程是受线上教学影响最小的学科了,因为就像我上面说的,我认为本身课程的核心就不是上课内容而是每周一次的作业以及围绕作业所构造的一套体系,而围绕着作业的这套体系似乎不管是线上教学还是线下教学效果都差不多,受影响较大的研讨课部分也被腾讯会议给很好的弥补了。所以总的来说面向对象的线上教学体验还是很不错的,可以称得上本学期给我感受最好的课了。

  最后也希望面向对象的课程组以后能发展的越来越好。

你可能感兴趣的:(北航OO(2020)第四单元博客作业暨学期总结)