OO 第四单元总结
1 本单元作业架构设计
1.1 第一次作业
第一次作业实现的是对 UML 类图的解析。
由于在 UML 源文件中,类图元素都是以一条条元素存在,它们之间的关系基本上是某个 UML 元素存储着父元素的 id 而没有形成可用于查询下一级元素的容器结构,因此必须自行设计各种类图元素,如 Class、Interface、Operation 等以设置合适的数据结构存储下一级元素(如 Class 需要存储类中的操作和属性,Operation 中需要存储操作中的各个参数)。与此同时,还需要实现对 UML 类图元素的解析,以实现将 UML 类图元素转换为自身设置的类图元素的过程。
在解析过程中,共进行三次遍历解析,每次解析不同类型的元素。第一次解析获得 Class、Interface、AssociationEnd。第二次解析获得 Association、Attribute、Operation、Generalization、InterfaceRealization。第三次解析获得 Parameter。
对于各种类图元素对下一级元素的存储容器的选择,一般采用 HashMap,并在解析时对元素进行添加。在实现查询操作时,通常下降到对应的类图元素中实现,以减少解析器类的复杂度。UML 类图如下:
1.2 第二次作业
第二次作业添加了对 UML 顺序图与 UML 状态图的解析,基本方法与第一次作业中大致相同,只是需要解析的元素增多以及在解析过程增加了对新增元素的解析(Region、State、Lifeline、StateMachine、Transition、Interaction)并增加了解析次数。在解析中,第一次解析 StateMachine、Interaction,第二次解析 Lifeline 和 Region,第三次解析 Message 和 State。第四次解析 Transition 和 Event,最后一次解析对第四次解析获得的元素进行再一次解析。UML 类图如下:
1.3 第三次作业
第三次作业增加了对 UML 模型进行有效性的检查。因此新建了一个查询类,调用检查方法时通过调用这个查询类的方法再下降到对应的类中进行调用。UML 类图如下:
2 架构设计及 OO 方法理解的演进
第一单元的多项式求导让我迅速体会到了“OO 是什么”,是因为为了实现多项式的求导,需要将多项式中的每一个不同种类的因子都转换成为一定的对象并实现相应的求导方法,再从下向上实现整个多项式的求导。这种每个类实现特定的功能,再组合到一起实现更大的功能情况,不就是典型的 OO 吗?
第二单元针对电梯的抽象以及研究电梯对象的运动策略,增加了多线程的应用。我认为这一单元的重点是在如何处理电梯与调度器之间的关系,以及电梯按照什么策略进行调度;同时,在多线程情况下,还必须考虑线程安全,实现同步和互斥访问。这一单元的设计大大提高了我在面对实际问题时的思考和实践能力。
第三单元是在 JML 规格下进行具体方法的实现,总的来说是这四个单元中最简单的。面对已经实现好的、具有特定要求的方法规格,我们的重心应当从“正确实现这个方法”转到“高效实现这个方法”,这就需要在阅读 JML 规格时,不仅仅要理解这个规格的含义,还要思考规格设计的内涵(这个方法最终需要实现什么功能),将需求抽象出来,选择合适高效的方法进行实现。
第四单元涉及 UML 模型的学习,通过将各种对象、关系抽象化、模型化,并使用树形结构实现了各层对象之间的联系以实现对各元素之间的关系。通过对 UML 各种图的元素进行解析,我也理解了 UML 模型的层次性以及内在逻辑性,并能够通过一些数据结构对元素进行管理与查询。
3 测试理解与实践的演进
在每次作业中,首先使用手动构造基本数据以及边界数据对每一部分进行分块化测试,为接下来的全局测试做好基础。
在将整个作业完成后,便会进行全局性测试。采用的测试方法有:编写评测机,对于某个输入样例,判断程序输出与机器计算输出是否相同(第一单元);对于某个输入样例,多个程序一起运行,比较输出结果之间的差异,也就是对拍(第三单元、第一单元);对于程序中出现的死循环、CPU 时间过长等 bug,可以使用 JProfiler 对程序进行运行时检查,判断死循环出现在哪个方法上或者哪个方法占用了过多的 CPU 资源(第二单元、第三单元)。
这四个单元中的测试经历让我明白:程序代码的完成只是“开始”,一份真正完美无缺的代码必然要经历各种数据的“折磨”以及各种诡异的情况才有可能出现;在测试的经历中,我也自行学习了一些新知识,对于拓展我的课外知识也有很大的帮助。
4 课程收获
-
学习了 OO 思想,并能够在这种思想的指导下完成程序编写
通过本课程学习,我从以前的面向过程式代码编写逐步转化到面向对象式的程序实现,并能够在面向对象思想的指导下,对某个特定问题进行分析并解决。
-
java 语言学习的提升
在上学期我对 java 语言有所了解并进行了一些学习,但还没有到很深入的水平,只会一些基本的语法。这学期大量的 java 语言的使用,让我熟练地掌握了 java 语言的更深层次的用法,特别是各种容器的使用以及多线程应用。
-
架构能力的提升
在面对复杂问题时能够对问题的各个方面和层次进行分层化、抽象化,建立合适的建构表现各个层次之间的关联关系,并由此获得合适的解决方法。
-
其他
git 相关、markdown 使用、对 java 程序进行打包、python 自动化测试等。
5 改进建议
- 希望实验课在结束后可以像训练一样给出答案,便于课后对课上实验中不懂的地方进行理解。
- 希望第四单元的强测结束时间可以提前,便于修 bug (如果有 bug 的话)。因为没有互测,对于强测系统也不至于要花两天时间才能出一个结果吧(最后一次作业更改数据后花了几十分钟就测评完成了),可以放在周一晚上出结果。
- 可以改进一下评论区,有时候重复问题出现,有时候很难在一个很多回复的贴子里找到自己需要的答案。可以在每个单元结束后推送一些优质帖子,让我们学习。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。