BUAA-OO-Unit 4-Summary

BUAA-OO-Unit 4-Summary

一、第四单元作业架构设计

  • 综述

    本单元作业要求实现对UML图的解析,处理输入的各个UMLElement,形成对应的关系结构,实现信息的查询。本单元主要考察的是对UML图的认识,同时我个人认为在第三单元的基础上加深了对规格化编程的训练,只不过把JML改成了介绍文档里的语言。相比第三单元,第四单元减少了对算法的要求,但是我个人感觉难度更大,因为需要考虑的条件非常的繁多复杂,对架构也有了更高的要求。

  • 架构设计

    • UML图

    • 核心思路

      为了方便设计,并防止不同UML图元素相互干涉造成不必要的麻烦,我开设了四个不同的类分别对elements进行解析处理。

      ClassStorageSequenceStorageStateMachineStorage分别用于对类图、顺序图、状态图相关元素进行解析、处理、存储。第三次作业中引入CheckRule类对所有检查指令中需要用到的元素进行处理。

      MyImplementation类通过调用以上四个类中存储的元素进行具体的指令实现。

      同时,对诸如UMLClassUMLInterface之类的元素,需要实现比较复杂的操作,因此重新构建了MyClassMyInterface类,从而实现复杂的功能。

      对于同类元素的存储,采取HashMap容器,降低查找的时间复杂度。

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

  • 第一单元

    作为从Pre才开始接触Java且不具备任何面向对象基础知识的小白,我只会按照以前写C语言的方法面向过程编程,也没有好好设计自己的架构,花费了大量的时间,干的却是走一步看一步的活,最终得分也是非常的惨烈。

    尽管如此,我还是通过三次作业逐渐体会到了面向对象思想的精髓之处,并尝试在自己的设计中运用。

  • 第二单元

    在第一单元的最后一次作业之后,我对Java的运用算是比较熟悉了,面向对象的思想也吸收的还可以。于是我在第二单元投入了大量的精力到架构的设计中,确立了输入请求-请求调度-处理请求这样清晰的层次结构,代码具备了相当不错的解耦性。

    尽管我依然在测试中出现了线程安全的问题,但是由于架构的合理,只需要修改细节即可。最终我在三次作业中没有进行一次重构,测试得分也还过得去。

    第二单元中,主要的收获就是生产者消费者模型的掌握以及对锁与调度的理解。也是在这个单元我觉得我的面向对象能力有了飞跃。

  • 第三单元

    经历了高难度的一二单元洗礼,第三单元完成起来就比较游刃有余了。架构方面由于官方包已经给出,并不需要自己思考太多,但是出于兴趣阅读了官方包代码之后,发现其设计非常精妙、合理,不得不感叹自己依然有很多需要学习。因此也算是吸收了一些优秀架构的优点。

    这一单元,开始思考代码规格化的意义,如何通过契约式编程来提高工程的严谨性,这对于未来的开发工作是很有裨益的。

  • 第四单元

    本单元的任务分层比较简单,即解析元素、存储元素、处理元素,因此架构设计上难度不大,自己比较出彩的地方就是早早对各种图、各种元素做了分类处理吧,这既避免了CheckStyle的制裁,也能防止太多元素种类互相影响的问题出现,对于本单元这种信息繁多的情况,这样设计是利于开发的。

    本单元一方面对于UML图有了更深的掌握,最重要的还是进一步体会了层次化设计的思想。

三、测试理解与实践的演进

  • 第一单元

    本单元由于刚接触oo,为完成作业而焦头烂额,没有很细致地构造数据,但是依靠构造随机数据就能取得不错的效果。

  • 第二单元

    ​ 本单元主要还是根据自己本地测试中出现的bug来构造hack数据。结果表明这样的测试方法还是比较有效的,因为诸如轮询、死锁等问题是比较普遍的。与第一单元相比,随机数据的hack成功率大大降低白盒测试或是根据已有bug测试在本单元中是更优的方法。

  • 第三单元

    JML为代码提供了严格的约束,通过仔细阅读JML可以找到许多边界条件以及容易疏忽的细节进行数据构造。

    同时,JML便于观测方法的复杂度,从而可以构造极限数据进行测试,方便进行优化。

    相比第二单元,随机数据又变得有效了起来,但是这会导致无法找出bug具体是在哪里出现。因此单元测试是十分有效且必要的,从JML约束的规格出发,对所有作业中涉及的指令进行全覆盖测试,从而更精准的定位bug。

  • 第四单元

    由于第四单元基本上和考期重合,加上本单元自动化生成数据需要兼顾随机性与强度,比较繁琐,因此没有太认真的构造测试数据,就对于某些特定指令进行手搓数据加以比较浅明的验证。

四、建议

  • 有不少同学在课程之前没有接触过Java,建议在Pre中增加Java的教程。具体重点我认为有:基础语法介绍,容器(包括HashMap、Array List、HashSet、TreeSet等等)的使用。

  • 第一单元的难度相比Pre有着非常巨大的飞跃,尽管课程组已经采取了预解析与正常作业两种选择,来给同学们一些缓冲,但是实际上预解析相当于直接把很关键的表达式解析给砍掉了,差别实在太大。

    前一次采取预解析的同学如果想在下一次换为一般解析模式,需要巨量的时间成本,甚至不一定完成得了。而如果三次作业都采取预解析的话,我认为获得的锻炼量是不够的,并没有接触到面向对象的核心

    因此,我建议在Pre中加入递归下降的教程,酌情考虑取消预解析模式,同时将第一次作业的完成时间延长至两周

  • 第三单元以JML为核心,但三次作业主要的难点还是在图论算法,两者不相匹配。相比之下,第四单元我认为更加合理,核心是UML,那就把难点放在对UML元素的理解上,不会有违和感。因此可以酌情减少第三单元对算法的考察,而将根据JML进行单元测试的部分内容作为考察内容。

  • 目前的中测与强测强度差距过大,一个漏洞百出的程序都能通过中测,尽管这样能降低有效作业的门槛,也能鼓励同学们更多地进行本地测试,但是中测过于简单我认为并不利于同学们好好完善自己的作业。希望课程组能加强中测强度

  • 希望能实时公布课上实验成绩。

五、课程收获

  • 掌握了Java这门语言,Java真好用 :)
  • 掌握了面向对象的思想,颠覆了我对编程的认识。
  • 掌握了线程安全、生产者消费者模型、JML规格化语言、UML图等知识。
  • 提升了构造数据的能力。
  • 代码能力有了很大的提升。
  • 结课之后看这一学期的历程,巨大的成就感。

希望在之后的代码开发中,能够好好运用自己在OO这门课中收获的知识;也希望自己能在未来的学习中,不要忘记自己是在大二下那一个个挑灯的夜晚,不惧困难,直面挑战。

posted @ 2022-06-27 20:53  yeger118  阅读(32)  评论(1编辑  收藏  举报