OO_unit4_UML暨学期总结


OO_unit4_UML暨学期总结

OO_unit4 设计

整体文件结构

- mycode // 代码根目录
    - mydiagram // 存放不同图的类
        - myclass // 类图
        - myinteract // 顺序图
        - mystate // 状态图

整体思路

UML 我的理解就是一颗树,但是这个树只能叶节点访问父节点,这对于索引是不利的。

所以,我的思路就是对于每一个结点记录他们的孩子,方便访问。并且在分别的图对应的类中使用 HashMap 存入不同结点和对应 id 的键值对,方便访问。

UML 图

UML 图

对于每一个图都有一个顶级父类 MyDiagram,对于每一个结点都有一个顶级父类 MyElement

MyDiagram 定义了最基础的获取元素,删除元素,增添元素的方法。

MyElement 定义了最基础的获取 id,获取 name,获取 parent 的方法。

对于类和接口,因为二者都用继承,都能拥有属性,所以定义了一个新的父类,用于统一管理这些方法。

TopoMapTopoNode 用来处理循环继承和重复继承,这两个类都为 Floyd 算法处理循环继承服务。

各次作业迭代

  • 第一次作业:第一次作业比较痛苦,看不太懂 UML,也不知道怎么实现。通过看之前学长的博客大概明白了就是要自己对输入的 UML 进行建模,实现索引等一系列操作。所以大概有了 UML 中 ClassDiagram 一侧的结构。
  • 第二次作业:第二次作业不难,主要大部分时间花在了重构。因为新出现了两种图,我之前把所有操作都实现在 MyImplementation 的做法很明显不好,导致代码行数太多。因此将各个部分抽象成了的 MyDiagram 的子类,然后 MyImplementation 只需要提供接口,然后调用其他类的接口就行。
  • 第三次作业:第三次作业也不算太难,唯一的难点大概就是循环继承的寻找,一开始使用的是拓扑排序,发现对于一些数据无法找到正确答案,后面采用 Floyd 算法,判断自己能否到自己,整体结构没有大改。

OO课程学期总结

个人总结

整个学期下来,感觉自己在 code 之前的架构设计和测试思维有了很大的提升。

首先是架构设计,之前 code 一般都是开始就写,对于几十行,一百行的代码基本轻轻松松。但是现在代码行数增加,直接写难度很大。自己在写前都会拿一个本子写写画画,设计类之间的关系和功能,还有类之间的交流。对于重点的算法设计,还会画大致流程图,寻找设计上的 bug。

特别是在第二单元的作业中,设计电梯和调度器的交流,画了不少,对于线程安全也思考很细致。所以整个单元下来没有因为线程安全而 de 很久的 bug。

在最后一单元作业的时候,开始写的时候基本架构就已经有了,而且架构已经有了一定的抽象考虑,减少代码行数。

然后是课后测试,这个方面,每次作业我都写了数据生成器,有些时候会因为自己对题目了解的不够,导致数据的覆盖度不够高。但是测试的思想已经扎根。整体的测试思路分为三步:

  • 第一步:才写完代码,自己手捏一些强度较小的数据,保证程序大致的运行,和各个模块的接口是否正确。
  • 第二步:对核心的代码进行单元测试,比如调度算法,图的算法。
  • 第三步:完成数据生成器,对代码进行较为全面的测试,以及性能的追求。

下面是各个单元测试的理解:

  • 第一单元:这一单元的数据生成蛮容易的,难得地方是正负得判断,因为 BNF 的定义,使得括号不能在答案里面随意出现,再写一个解析器的话思路也和作业差不多,所以采用的是构造特定数据,对化简模块进行测试,看是否存在括号在化简中的滥用。所以这次测试的重点是化简模块的单元测试。
  • 第二单元:这次测试的重点一个是正确性,一个是时间。为了生成有一定强度的数据,来测试自己调度算法的效果,数据的生成就不能太随机。所以这个单元比起上个单元来说,测试重点是数据强度。
  • 第三单元:这个单元是JML,测试重点是算法复杂度,数据生成的时候,会针对某一个算法,枚举某些指令。
  • 第四单元:这个单元查询指令和合法性检查繁多,因此重点是数据的覆盖面要大。对此我的数据生成重点放在了特定指令枚举,保证某些指令的查询强度够高。另外这次作业输入因为格式要求,所以不能随手捏数据,我定义了一些接口,用于自己捏造数据,保证了数据的随机性和强度。

课程收获

知识层面上,学习并实践了面向对象这一思想,这一思想对我影响甚至能在我的评测机中看出来,第一单元的评测机基本是面向过程编程,后面就开始使用类来管理数据生成器的一些属性和方法。

实践层面上,代码风格也越来越规范,写代码的时候有意识的压缩行数,函数解耦,减少嵌套。在实现代码的时候,也会使用一些设计模式,比如经典的单例模式。

其他方面上,认识了很多大佬,和同学一起对拍 OO,讨论架构也让我难忘。

课程建议

  • 课程和实验中能否加入一些设计模式的内容,既然面向对象是一项工业广为使用的思想,那也应该多介绍一些工业规范。
  • OO 作业指导书太长了,而且还有多个大标题,小标题,阅读难度有点大,能否根据大标题分一下页面,或者给一个导航栏方便学生找到内容。
  • lock感觉介绍得晚了一点,如果可以的话,对于第二单元能否多加一个预习,提前熟悉以下 synchronized 和 lock。第二单元第一次作业介绍的同步代码块,介绍 lock 的时候代码架构都写好了,本着能跑就绝对不改的生活哲学,所以根本就没有使用 lock。可以的话提前介绍一下,这样大家也能自行选择,进行对比,更好的学习多线程。

Author: Dovahkiin
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Dovahkiin !
  TOC