微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OO-第四单元总结-2021

Unit 4 UML单元总结

一 本单元的架构设计

与上一单元相比,本单元作业最大的变化就是有很高的架构自由度。类的拆分、容器的选择、类属性的设计...每一项都有很大操作空间。

本单元的整体架构上,先设计包含初始化和各个查询方法接口的UML图类,并进一步针对每种UML图类(类图、顺序图、状态图共三种)分别设计具体元素类,根据查询方法扩展对应功能。自行设计的类间关系如下(precheck部分未包含其中):

image-20210626163432559

具体地,三次作业UML类图及详细设计如下。

HW13

只包含UML类图的查询。

image-20210626163706162

采用完全提前初始化形式,在初始化时将全部可能查询到的属性保存在类中,以防止重复多次查询导致的TLE。

于是,根据查询方法的要求:

  • MyUmlClass类中利用HashMap存储以下属性,以确保在O(1)时间内快速查询:

image-20210626164715944

  • MyUmlInterface中利用·HashSet存储自己继承的接口selfSuperInterfaces和继承的接口继承的接口allSuperInterfaces

以上全部在MyUmlInteraction中的初始化方法init()调用对应类中自行实现的方法进行预存储,在相应查询方法中调用对应属性值的get方法即可。

在具体算法实现上,比较需要注意的是类与接口间的继承。在初始化时,我采用了dfs进行实现。

HW14

从类图扩展到三类UML图:UML类图(MyUmlClassModelInteraction)、顺序图(MyUmlCollaborationInteraction)、状态图(MyUmlStateChartInteraction)。

image-20210626163730434

对顺序图和状态图的设计思想与类图完全相同,在新设计的各类中保存需要的属性即可。

HW15

增加错误处理功能(UmlStandardPreCheck)。

image-20210626163944064

在我的设计中,错误检测部分在完全初始化完成后进行。于是在进行错误检测时同样可以直接调用各个类中已经存储好的属性。

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

Unit 1

  • 第一单元刚一入手的第一次作业对下一次作业可能出现的状况没有任何预判,于是仍然是面向过程,编写时只关注于该次作业本身的任务上,导致代码毫无扩展性。
  • 而在第二次作业中尝试重构代码(几乎是重新写了一遍),改为面向对象的同时利用编译原理中的递归下降进行表达式翻译,整体效果不错,在第三次作业中得以延续,只添加了几十行代码就ac了。
  • 第一次与第二次作业的对比使我充分感受到了一个好的架构在程序迭代时的重要性。

Unit 2

  • 代码架构上,一以贯之的使用了生产者消费者模式,同时在课下(以及实验中)我也尝试通过阅读推荐书目了解了多种多线程设计模式,并在课堂展示中分享了读写锁模式未来模式,与老师和身边多个同学讨论并尝试将模式应用、落实到作业中的可能性。
  • 总结起来,我在本单元体会到了设计模式的重要性。事实上,说是设计模式,其本质就是前人总结出的良好实际经验;只要情景合适,将这些设计模式拿来就用,往往就能在代码架构上取得良好结果。重复造轮子绝不可取。

Unit3

  • 第三单元JML,一上来的时候我过分轻敌,大致照着JML写出代码就直接提交,结果在强测中损失惨重。事实上,这一单元的考察很综合,从算法的选择、容器的选择到测试都有很细致的考察。
  • 架构设计上,我后来尝试了单独创建图类并进行分类处理。算法上,我使用了并查集、优先队列、Tarjan算法等以降低复杂度。
  • 数据存储的重要在这一单元体现的很明显。在多次练习即底层代码阅读中,我了解了包括HashMap, ArrayList, LinkedList,PriorityQueue等容器的底层实现方式、添加、查询、删除的时空复杂度,明确了各个容器的特点,可以在各种情况下进行正确的容器选择。

Unit4

  • 第四单元UML考察的能力相较于前三个单元而言最为综合、自由度也最高。四个单元顺下来,其实强烈的感受到单元间层层递进的关系;到了最后一个单元,也可以说是一个面向对象课程的总结与升华。经过前三单元的历练,可以说我已经掌握了架构的方法,也终于能够写代码之前思考好架构方式和大致的实现方法再动手写代码,所以尽管第四单元难度不小,确实是我完成代码时间最短的一个单元。

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

第一单元借鉴递归下降想法,利用了Python编写程序进行格式化表达式样例构造。在测试过程中,主要是使用print法以及断点进行bug定位(这两种最基础的方法页贯彻了整四个单元)。

第二单元多线程电梯可能是测试上最困难的一个单元。多线程的坑我几乎一踩一个准,暴力轮询、死锁等等问题在我的代码中屡屡出现。而关于多线程的调试与优化,能够编写python程序使批量输入带时间戳的请求,这也大大提高了测试的效率。同时,还利用了java自带的JProfile插件,逐方法进行死锁定位。

第三单元主要利用JUnit进行测试程序的编写,对各个方法进行逐一的覆盖性测试。但说是“覆盖性”,实际上对于一些边界样例在测试程序中很有可能考虑不到,这就需要在代码编写前和编写中充分理解JML代码,并对可能出现的各种情况进行记录。

第四单元充分掌握了几种UML图,能够对自己的代码架构进行有效评估,并综合使用了前面全部的测试方法。

四 课程收获

第二年上OO,仍然收获良多。可能是我第一年确实过分划水的原因,在第二年仍然感觉到压力的同时也在持续输入着新的知识,包括对容器和设计模式的更深层掌握、对代码架构的把握等等。同时,我也积极将我之前(失败)的经验与身边许多同学分享,在交流过程中我也从别人身上学到了许多良好的学习方法。

整个面向对象课程核心训练的,在我看来是以工程化的方式解决实际问题的能力。工程化这个词蕴含的东西就很多了,包括:有效、高效、更强的可扩展性...为了达到这个目标,我们进行了面向对象、多线程编程,使用了不同的设计模式以及多种架构,学习了系统的调试、测试方法,掌握了规范性语言使代码规范化等等。这些方法各个都很实用,也需要未来的我持续将他们应用于我未来的代码中,这样才能真正掌握OO的精髓。

五 具体改进建议

  1. 希望能在course平台公布实验课成绩以及测试结果(如果不方便每次公布,每单元公布一次也可以;至少能知道自己哪里错了,能对该单元知识进行巩固学习)
  2. 在每次官方代码修改时进行更有效的提醒,比如发布微信群公告。有的时候会因为错过修改,de几个小时的空气,有点气馁x。
  3. 第一单元表达式部分的要求有些过分琐碎,最后debug环节花费了大量时间de一些表达式理解上的细微bug,但感觉这些时间花费得与OO思想相背离。故我认为可以适度降低对表达式的要求。
  4. 提高指导书语言的准确性。前三单元都没有任何问题,但到了第四单元,有些关于“继承”等关系的表述不够清晰,很多都是靠同学在讨论区中的提问才得以明确。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐