面向对象第四单元总结

Posted DDoSolitary

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象第四单元总结相关的知识,希望对你有一定的参考价值。

本文为面向对象课程第三单元“UML”作业以及整个课程的总结。

架构设计

本单元作业的架构设计主要分为两部分:将输入的 UML 模型数据用 Java 类和对象组织起来便于查询,以及设计实现查询接口的类。

UML 模型

UML 模型的组织在三次作业中没有什么大的改动,第二次作业单纯地添加了新的模型种类,而第三次作业只是为了新的验证功能做了细节上的改动,所以这里仅给出第三次作业中使用的最终版本。

类图

类图的结构在本单元的三种模型中是最复杂的,需要支持许多不同类型的元素。

所有代表类图中元素的类都以 MyUmlElement 这个抽象类为公共的基类,它派生出来的所有非抽象类都和输入数据中的相应元素类型对应,但去除了输入中不需要的内容,仅保留对查询操作有用的数据,同时还将原本用字符串 ID 表示的引用关系改为直接使用 Java 的对象引用。

MyUmlTypeRef 的两个派生类则用于表示类型引用(与输入的 NameableType 对应),MyUmlBuiltinTypeRef 表示对内建类型的引用,其中仅存储类型名字符串,而 MyUmlCustomTypeRef 则表示对类图中定义的类型的引用,其中直接存储了被引用的类型对应的 MyUmlType 对象。

顺序图

第二次作业中加入的顺序图就简单了很多,由于只有消息数量的查询,也没有必要设计专门的类表示 UmlMessage,仅在 MyUmlLifeline 中存储了各种消息的数量。

状态图

状态图同样十分简单,处理时将 UmlStateUmlFinalStateUmlPseudostate 统一用 MyUmlState 类来表示,仅使用 MyUmlStateKind 枚举类型来进行区分。此外,因为输入保证 UmlRegionUmlStateMachine 一一对应,这里就直接在 MyUmlStateMachine 类中存储所有状态,不再单独为 UmlRegion 设计类了。

查询接口

第一次作业中的查询接口仅涉及类图,所以直接用一个类实现所有查询方法即可。

第二次作业由于有三种不同的模型,它们之间关联不大,放在同一个类中实现显然不太合理,而且也很容易超出 Checkstyle 配置中的行数限制,所以我将三种模型图的查询方法分别用三个类实现,然后再用一个 MyUmlGeneralInteraction 类实现题目要求的接口,这个类会在构造函数中用接收到的数据分别构造三种模型对应的查询接口类,然后在实现接口的各个查询方法中去调用对应模型的查询方法。

第三次作业新增的模型验证函数同样还是放在各个模型对应的查询接口类中,再由 MyUmlGeneralInteraction 调用。此外由于类图的查询接口类 MyUmlClassModelInteration 过于复杂,还超过了 Checkstyle 的行数限制,所以我把其中相对独立的解析输入数据的代码提出来单独作为一个类(理论上讲其他两种模型的查询接口类也可以这么处理,但是因为它们都十分简单,也没有必要去做过多的抽象了)。

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

在思考了一个晚上以后,我发现我实在想不出来我对架构设计和 OO 方法有什么理解,一直都是按照直觉来进行架构设计的,而因为自始至终都没有理解,自然也就谈不上什么演进了,所以无法完成这部分博客作业,望老师和助教谅解。

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

整个课程中我采用的测试方法都是编写程序生成随机输入数据进行模糊测试(根据分类方法的不同,也可以称为集成测试、黑盒测试),这么做的主要优点是可以覆盖较为全面地测试各种手工构造数据时难以想到的情况,同时还可以在互测环节方便地重用测试程序而无需完整地阅读被测程序的源代码。

令人遗憾的是由于我在阅读题目以及编写测试程序时的各种疏忽,导致有时测试程序本身有错误或不够完善,没有发现一些代码中的 bug,最终导致在互测和强测环节失分。这在一定程度上也反映了由同一个人编写程序本身和测试代码的坏处,因为在编写程序本身时产生的误解或遗漏考虑的情况,往往在编写测试时也不会想到,导致测试无法发现此类 bug。

比较讽刺的是在最后一个单元中,由于临近期末时间紧张,我在三次作业中都没有编写测试程序,完全依赖于样例以及提交后的弱测,但结果全都在强测中获得了满分。我想这只能认为是我运气比较好了。

课程收获

这这门课程中我最大的收获大概是学习了 Java 这门语言。尽管我之前就使用过一些与 Java 十分相似的面向对象语言(如 C#、Kotlin),对 Java 也有一定的了解,但在学习这门课程之前我并没有实际使用 Java 进行软件开发的经验,而在完成课程作业的过程中,我逐渐熟悉了 Java 的语法和特点,掌握了编写基本的 Java 代码的必要知识。

在此之外我还学到了一些杂七杂八的知识,比如 JML、UML 等,但遗憾的是我并不觉得它们在课程以外会对我有什么帮助。

改进建议

  • 本次博客作业大部分要求实在有些抽象,对于我这种不会写作文水平较低的学生很不友好。
  • 部分实验课及官方包提供的代码质量不高,甚至无法通过 Checkstyle 的检查。
  • 课程网站有一定的改进空间,比如在进入某一次作业的介绍后无法方便地切换到其他作业,只能点击“所有课程”返回到最上层重新开始选择;只能提交测试后只能显示最近一次提交的结果也不太方便,希望能够看到历史提交记录。
  • 第一单元和第二单元的性能分个人认为不是一个好的机制,尽管最后对成绩影响不大,但由于在完成作业时不知道具体占比和评判基准,会导致不必要的焦虑,有助长“内卷”之嫌。

以上是关于面向对象第四单元总结的主要内容,如果未能解决你的问题,请参考以下文章

面向对象第四单元总结

面向对象第四单元总结——UML

面向对象设计与构造课程总结作业

2021面向对象第四单元作业

OO总结

面向对象第四次总结性博客