OO第四单元总结

OO第四单元总结

一、架构设计

(一)Hw13

  • 架构设计:
    • 本次作业完成后功能:导入UML图,可查询UML类图的相关信息。
    • 将类图的每种元素设置成一个单独的类,其中包含它自己的信息以及它包含的下一级的元素的容器,比如MyUmlClass就包含了自己的信息umlClass和下一级元素MyUmlOperation、MyUmlAttribute的容器HashMap/ArrayList。
    • 每次implement调用相应方法都一层层下降到所属的元素级别,比如查询class相关信息的方法由class处理、查询operation相关信息的方法由operation处理。
  • UML图

(二)Hw14

  • 架构设计:
    • 本次作业完成后功能:导入UML图,可查询UML类图、顺序图、状态图的相关信息。
    • 比起上次新增加了顺序图和状态图相关的元素和指令。
    • 与类图类似,将顺序图、状态图的每种元素设置成一个单独的类,其中包含它自己的信息以及它包含的下一级的元素的容器,比如MyUmlInteraction就包含了自己的信息umlInteraction和下一级元素MyUmlLifeline、MyUmlMessage的容器HashMap/ArrayList;每次implement调用相应方法都一层层下降到所属的元素级别,比如查询interaction相关信息的方法由interaction处理、查询stateMachine相关信息的方法由stateMachine处理。
  • UML图

(三)Hw15

  • 架构设计:
    • 本次作业完成后功能:导入UML图,先对导入的UML图进行合法性检验,若合法则可查询UML类图、顺序图、状态图的相关信息,若不合法则抛出异常。
    • 比起上次新增加了检查UML图是否合法的指令。
    • 在每次初始化implementation完自动调用检查合法性的指令,若合法则继续前面作业完成好的查询操作,若不合法则抛出异常。
  • UML图

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

第一单元 表达式化简

本单元刚开始时我对java的了解还仅停留在java最基础的继承、多态语法。

第一次作业我仔细研读了助教给的training框架,把递归下降的方法弄懂了,收获巨大。虽然在当时pre2只写了一半、语法都不怎么了解的情况下完全弄懂递归下降花了将近一天的时间,但是弄懂以后真的叹为观止。但是由于pre3没写完,我并没有用正则表达式匹配的方法匹配表达式的每一项,导致解析表达式的代码比较冗长(不过我认为正则表达式着中国强鲁棒性的工具有好处也有坏处,好处是能很简洁地处理表达式,坏处是只要写错一个细节就可能导致大量翻车,而且比较难查错,需要很谨慎地思考每一种情况或者大量随机数据轰炸才行)。

第二次作业是我最最痛苦的一次作业,也是收获最大的一次作业。第一次作业我就花了很长时间研究怎样在拆括号的时候把负号拆进去,结果第二次作业的时候我发现第一次作业拆括号的方法只能拆对第一层括号。再加上那一周增量开发的任务也不少,再加上基物实验耽误了将近一天时间,我第二次作业的时间非常紧张。周六早上爬起来就一直在写代码写到下午三四点钟,拆括号负号依然拆不对,当时心态血崩,觉得自己肯定写不完这一次作业了。不过哭了一会儿冷静下来以后,就突然开窍了会写了,现在看来也是人到绝境就能被逼出来无限的潜能。这次作业我最大的收获是①了解了java深拷贝和浅拷贝的机制;②研究负号如何在递归下降过程中拆进每一项的过程让我对递归下降方法的理解更加深刻,并且能熟练运用;③深刻理解了toString()方法,一开始在toString方法里修改了原对象导致每次print出来的式子都不一样,反复横跳,此后我都明白了不要在toString()、equals()这类纯方法中做出任何“修改”行为,只能“读取”!

第三次作业几乎没怎么改动第二次作业,不再赘述。

  • 本单元主要收获如下:

    • 熟练掌握和运用递归下降的设计方法。
    • 了解了java深拷贝和浅拷贝的机制。
    • 深刻理解了toString()、equals()方法。
  • 本单元不足之处:

    • 没有运用正则表达式,此后作业也没再有机会机会,因此比较遗憾到现在对正则表达式也不熟练。
    • 没有顶层设计的意识,有了大致的思路就开始写代码,导致写的过程中因为之前考虑不周或者实现困难不断地重构重构重构每个小模块;并且前面作业为了简单让有几个小模块兼顾了多个功能导致模块间耦合度很高,后期迭代非常不好修改,动辄大量重构。因此浪费了很多时间,并且在第三次作业中出现了设计上的漏洞。

第二单元 多线程电梯

本单元刚开始的时候完全不知道什么是多线程,纯纯小白一个。

第一次作业主要学会了多线程的基本语法和知识、生产者-消费者模型、线程安全容器blockingQueue如何使用、多线程程序如何debug。还了解了单例模式等设计模式。除此之外,吸取了第一单元在顶层设计上吃的亏,我为了方便后续迭代在顶层设计上进行了尽可能的优化,让结构层次更加清晰、模块间耦合度尽量减少、模块的功能尽量集中和单一,在之后的迭代中节省了很多时间。

第二次作业、第三次作业由于第一次作业的设计比较好并且没什么新知识要学,迭代非常轻松(可能是本学期最轻松的两次作业,都是花了一下午多一点时间就写完了)。学会了主要的时间花在了测试上。

  • 本单元主要收获:

    • 学会了多线程的基本语法和知识、生产者-消费者模型、线程安全容器blockingQueue如何使用、多线程程序如何debug。
    • 了解了单例模式等设计模式。
    • 自己写程序生成数据(但是不会加递增的随机时间戳、不会写正确性检验还得纯靠肉眼检查正确性,所以作用很有限)。
  • 本单元不足之处:

    • 由于第一次作业开始就用了线程安全容器blockingQueue,我对syncronized块和ReentrantLock用法都比较基础;并且对wait-notify()了解很浅,只用它写过单独的生产者-消费者模型和读实验中的代码并填空,对wait-notify()如何应用在电梯这种复杂的多线程程序中、wait-notify()发生了死锁或线程安全问题如何debug还不怎么了解。
    • 对CPU时间和运行时间的测试不足,不会自己写评测机获取CPU时间和运行时间。

第三单元 JML规格

本单元刚开始的时候完全不知道JML规格是什么,纯纯小白入门*2。

第一次作业学会了怎么读和写JML规格,并且学会了怎么分析嵌套了n层括号的复杂JML规格。除此之外,我还学会了并查集算法。第二次作业一开始用的大一写过的prim算法,后来和同学交流以后意识到知道所有边的情况下用并查集+kruscal算法时间复杂度更低。第三次作业dijkstra让我学到了priorityQueue更新权值以后不会自动重排而是add一个新结点以后再重排;并且学会了堆优化的dijkstra算法。本单元给我印象最深刻的就是各种算法的选取,并查集、最小生成树、kruskal算法、堆优化的dijkstra算法;和对时间复杂度的简化,如对算法的优化、缓存变量减少查询的时间复杂度。

  • 本单元主要收获:

    • 学会了怎么读和写JML规格、怎么分析嵌套了n层括号的复杂JML规格。
    • 复习和学习了多个算法以及如何对它们进行时间复杂度的优化。
    • 了解了priorityQueue的性质,学会了重写比较器comparator(以及更高级和简洁的写法)或自己写一个类继承comparable接口。
    • 自己写程序生成数据。
  • 本单元不足之处:

    • 应该搞清楚被封装好的模块的每一个方法的原理再用,被priorityQueue只有add新结点才更新的性质背刺了。

第四单元 UML图

本单元刚开始的时候只知道UML的类图,不知道顺序图和状态图,并且也对关联、直接关联、依赖关系有什么区别一知半解。

第一次作业让我更加明确了类图各个元素之间的概念和关联、直接关联、依赖关系的区别。第二次作业让我详细地了解了顺序图和状态图。第三次作业让我知道了什么样的UML图是合法的。虽然很多人评价第四单元是最简单的,但是由于需要谨慎地扣指导书的细节和考虑各种情况,真的费时又费力。在写java程序上收获不大,但是在扣细节和考虑问题的严谨性上花了大部分时间。

  • 本单元主要收获:
    • 详细了解了UML类图、顺序图、状态图和相关元素的定义。
  • 本单元不足之处:
    • 烤漆时间紧张,没有花什么时间测试。

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

第一单元 表达式化简

本单元我的测试主要是靠自己手动编数据、和同学交流和看群里的易错问题。手动编数据能测出来大部分问题,因为对自己的程序比较了解所以可以根据每一处比较关键的if-else编相应的测试全部覆盖到,对每一种功能进行所有情况下的测试。毕竟大量数据轰炸也需要手动补充一些边界情况。不足的是比较费时间(而且对我这种测一测觉得差不多就摆烂了的懒人……容易翻车啊)。

第二单元 多线程电梯

本单元我的测试主要还是靠自己手动编数据+自动生成数据后肉眼验证正确性。手动编数据能测出来大部分问题,因为对自己的程序比较了解所以可以覆盖到每一个关键的功能。虽然会用python写简单的生成指令的程序了(但是还不会加随机递增的时间戳,因此随机性也不够),但是因为不会写正确性检验的程序只能靠肉眼检查正确性,导致数据规模很小,而且检查起来特别费时间。除了测试非常非常费时间之外,还不能做到全覆盖,尤其是线程安全问题的bug,往往需要大量数据轰炸才能测出来,对我这种肉眼检查党很不友好。除此之外测CPU时间和程序运行时间也不太会弄,只能尽量优化策略。

第三单元 JML规格

本单元我的测试方法取得了历史性突破,可以靠自己手动编数据+自动生成数据+对拍的方式来测试了。能够对拍真是太舒服了,找到理解错误和写错的方法效率很高;查询指令的模式也非常规范,可以简单地生成一些指令。

第四单元 UML图

本单元主要是靠以前的UML图倒模和自己根据每种指令情况画UML图进行测试,除此之外,最重要的还得是靠扣指导书细节。

四、课程收获

本学期的OO课终于落幕。一学期以来,我的收获不仅在于学到了面向对象的思维方式、学会了熟练写java程序、学会了多线程的如何写和如何debug、学会了JML规格和UML等等知识和技能,而且掌握了递归下降、单例模式等设计模式和方法。并且在自己测试中思维更加严谨,也在努力尝试自动化测试的过程中自学python,不断突破自己对有难度的问题的恐惧和不自信,尝试自己不会的东西。

上完一学期,我可算是理解了为啥我们OO叫“昆仑课程”。真是一山更比一山高,每个单元都不轻松,第一、二单元写程序本身难,第三、四单元很容易小问题导致大翻车因此需要大量充分测试也难……总之是一学期没有一天是轻松的。不过也确实学到了非常多东西,感觉得到自己的进步,并且不断尝试新东西然后有收获的正反馈过程也帮助我建立了自信心(大概是觉得自己这一学期过得很充实而开心吧,不像上学期一样把大量时间浪费在了低效的内耗中。

我其实挺喜欢写java的,坐在那儿调bug可以调一下午都不觉得不耐烦或者烦躁,比起我大一写C语言时候的样子……真是转性了。可能是面向对象的语言比面向过程的语言更适合我。在6系呆了一年,我从初三第一次测MBTI就是INTJ,结果现在变成ISTJ了(虽然S和N的偏向性非常小),适合的职业中终于出现了计算机程序员和一系列计算机程序员相关职业,不知道算不算6系培养的成功……

anyway,在目前学过的CO、OO、OS三门核心专业课里面,我最喜欢的就是OO了。学习过程高效,也很人性化(每个单元第一次作业都给一周半~两周时间、烤漆作业延长ddl等),除了强测和互测机制太卷以外(但是和CO比起来OO的变态程度算是小巫见大巫了),总体来讲体验还是挺好的。希望北航的OO课越来越好。

五、改进建议

  1. 实验课和training阅读助教代码真的每次都收获很大,如听仙乐耳暂明。相比之下,研讨课的收获就比较小,除了第一单元、第二单元研讨课和组员交流收获比较大以外,其他研讨课听同学们分享,对我个人而言大部分都没有用到实处。感觉同学分享环节可以减少一些,然后多拿一些课来考实验,比如可以多增加几次第二单元的实验课让我们对多线程wait-notify、blockingQueue、syncronized块和lock锁都实战了解一下,要不然其实大部分人都是只了解自己写的那一种锁或者方法。
  2. 可以按照四、一、二、三的顺序来布置作业。第一周入门的时候就直接上珠穆朗玛峰消化不良,而且第四单元难度真的不低,扣指导书细节非常费时间,放在烤漆其实也挺麻烦的,放在第一单元可以让大家先学了UML,后面写博客再画也方便。
  3. 或许可以给每个同学1~2次机会补强测分数(可以设置个上限比如最多补到80分之类的)。因为很简单的设计问题或者一两行代码翻大车还是挺心塞的。
posted @ 2022-06-25 16:24  Siazxyyy  阅读(55)  评论(1编辑  收藏  举报