本单元的主要学习内容是学习 UML 类图的相关知识,设计自己的 UML 分析器,并每次根据单元所给指令增加分析器的功能。在完成作业的同时,必须要对 UML 本身有着足够的了解与认识。
在 MyImplement 即主类构造中,对传入的 UML 元素进行整合进入该分析器的各个大集合中,根据元素特点与关系,我设计了 MyClass,MyInterface,MyCollaboration和MyStationMachine类,进行存储各自全部子元素,并在其内部进行分类。在实现类功能的时候也是设置类内部方法直接进行调用即可,这样使得各个整体具有高内聚,低耦合的特点。与此同时,设置 JudgeType 工具类,其中封装了大量的其他操作函数。
本单元涉及到到相关算法并不是很多,我主要用到了一下算法:
本单元前两次作业未出现 BUG,第三次也已经经过自己设计的测试集,希望强测顺利!
尝试使用 Junit 对代码进行了单元测试,尤其是上述提到的和算法有关的相关指令。并初步学习了解了 Junit 的使用。
自动化测试:通过大量随机生成与专门针对图的稠密度的数据,对程序进行攻击并检测 CPU 所用时间,同时使用 assert 写出评测机对运行结果的正确性进行校验。
本单元的主要知识点就是 UML 图,初次接触第一次作业的时候,甚至都不知道作业要完成的任务,最后通过反复学习课程组所给出的资源与认真阅读指导书,终于明确了任务,同时也收获了相关的 UML 知识,也顺利地完成了作业。
第一单元实现的是表达式的解析和化简,主要是训练我们向下解析的层次化设计思维。在指导书的限制下,表达式的层次化结构非常清晰,通过针对层次建立类,并管理这些类的实例是主流的解析方法,其中困扰我最大的问题就是如何计算表达式,由于我选择的是递归下降法求解,因此每次递归返回的结果应该是一个“通货”,最终,我使用了一个类似于 HashMap 的结构解决了这个问题。这一单元可谓是将层次化设计体现得淋漓精致,如果没有很好的架构,估计拓展和完成作业是十分困难的。
第二单元通过电梯调度训练了我们的线程安全设计思维。不过我们并没有着重于锁的种类和使用,而是着重于研究线程安全的交互方法。我认为这是一整个课程中最有趣的单元也是最难的单元,有趣是指它贴近我们日常生活,同时电梯调度中也有调度算法之间的博弈。困难是因为它设计到了多线程之间的知识,由于我之前虽然学习过 Java 语言,但却完全没有学习过多线程的知识,因此在打下多线程基础的时候花费了很多时间。同时由于此单元作业坑点较多,比如乘客人数种种限制,所以也耗费了我大量的时间。最终,除了第三次作业中未校验上电梯之外导致横向电梯会抢载其无法到达的乘客导致程序进入死循环的 BUG,本单元也算是顺利通过了。
第三单元的主题是使用 JML 进行规格设计,完成其规格指定的功能。在本单元中我又学习到了和工程有关的语言,即 JML,同时还熟悉掌握了和图有关的相关算法。通过单元作业的训练,对阅读 JML 规格有了一定的基础,相信之后也会发挥着重要的作用。本单元唯一出现的 BUG 就是计算方差时将容器的 size() 方法作为分母,导致了除 0 错误,这也让我以后写代码的时候一定要注意这种小细节,不能够大意与浮躁。
第四单元引入了 UML,我的理解是本单元通过设计 UML 解析器,从而理解 UML 中的相关概念。我们在其中也要将类图,顺序图和状态图相关元素设计相应的结构进行管理,从而在设计架构上就做到不重不漏。本单元我认为最开心的一点就是学习到了 UML 的相关知识,相信这在之后还会有更大的意义。
OO课程内的学习收获是非常丰富的,我觉得 OO 课程使得我真正增强了写代码的功底,因为除了博客周之外,每周都画了一到两天的时间在写 OO 作业,造数据造评测机,甚至周日还得惦记自己的代码有没有被 Hack。出去代码,我还学到了层次化设计思想,熟悉了有关图的相关算法,了解了 JML 规格与 UML 类图,这些对我以后参与工程化的项目有着无可替代的价值和意义。喜欢这门课程,敲代码过强测的感觉真的超级棒!