关键词:
本文为面向对象课程第三单元“UML”作业以及整个课程的总结。
架构设计
本单元作业的架构设计主要分为两部分:将输入的 UML 模型数据用 Java 类和对象组织起来便于查询,以及设计实现查询接口的类。
UML 模型
UML 模型的组织在三次作业中没有什么大的改动,第二次作业单纯地添加了新的模型种类,而第三次作业只是为了新的验证功能做了细节上的改动,所以这里仅给出第三次作业中使用的最终版本。
类图
类图的结构在本单元的三种模型中是最复杂的,需要支持许多不同类型的元素。
所有代表类图中元素的类都以 MyUmlElement
这个抽象类为公共的基类,它派生出来的所有非抽象类都和输入数据中的相应元素类型对应,但去除了输入中不需要的内容,仅保留对查询操作有用的数据,同时还将原本用字符串 ID 表示的引用关系改为直接使用 Java 的对象引用。
MyUmlTypeRef
的两个派生类则用于表示类型引用(与输入的 NameableType
对应),MyUmlBuiltinTypeRef
表示对内建类型的引用,其中仅存储类型名字符串,而 MyUmlCustomTypeRef
则表示对类图中定义的类型的引用,其中直接存储了被引用的类型对应的 MyUmlType
对象。
顺序图
第二次作业中加入的顺序图就简单了很多,由于只有消息数量的查询,也没有必要设计专门的类表示 UmlMessage
,仅在 MyUmlLifeline
中存储了各种消息的数量。
状态图
状态图同样十分简单,处理时将 UmlState
、UmlFinalState
和 UmlPseudostate
统一用 MyUmlState
类来表示,仅使用 MyUmlStateKind
枚举类型来进行区分。此外,因为输入保证 UmlRegion
与 UmlStateMachine
一一对应,这里就直接在 MyUmlStateMachine
类中存储所有状态,不再单独为 UmlRegion
设计类了。
查询接口
第一次作业中的查询接口仅涉及类图,所以直接用一个类实现所有查询方法即可。
第二次作业由于有三种不同的模型,它们之间关联不大,放在同一个类中实现显然不太合理,而且也很容易超出 Checkstyle 配置中的行数限制,所以我将三种模型图的查询方法分别用三个类实现,然后再用一个 MyUmlGeneralInteraction
类实现题目要求的接口,这个类会在构造函数中用接收到的数据分别构造三种模型对应的查询接口类,然后在实现接口的各个查询方法中去调用对应模型的查询方法。
第三次作业新增的模型验证函数同样还是放在各个模型对应的查询接口类中,再由 MyUmlGeneralInteraction
调用。此外由于类图的查询接口类 MyUmlClassModelInteration
过于复杂,还超过了 Checkstyle 的行数限制,所以我把其中相对独立的解析输入数据的代码提出来单独作为一个类(理论上讲其他两种模型的查询接口类也可以这么处理,但是因为它们都十分简单,也没有必要去做过多的抽象了)。
四个单元中架构设计及 OO 方法理解的演进
在思考了一个晚上以后,我发现我实在想不出来我对架构设计和 OO 方法有什么理解,一直都是按照直觉来进行架构设计的,而因为自始至终都没有理解,自然也就谈不上什么演进了,所以无法完成这部分博客作业,望老师和助教谅解。
四个单元中测试理解与实践的演进
整个课程中我采用的测试方法都是编写程序生成随机输入数据进行模糊测试(根据分类方法的不同,也可以称为集成测试、黑盒测试),这么做的主要优点是可以覆盖较为全面地测试各种手工构造数据时难以想到的情况,同时还可以在互测环节方便地重用测试程序而无需完整地阅读被测程序的源代码。
令人遗憾的是由于我在阅读题目以及编写测试程序时的各种疏忽,导致有时测试程序本身有错误或不够完善,没有发现一些代码中的 bug,最终导致在互测和强测环节失分。这在一定程度上也反映了由同一个人编写程序本身和测试代码的坏处,因为在编写程序本身时产生的误解或遗漏考虑的情况,往往在编写测试时也不会想到,导致测试无法发现此类 bug。
比较讽刺的是在最后一个单元中,由于临近期末时间紧张,我在三次作业中都没有编写测试程序,完全依赖于样例以及提交后的弱测,但结果全都在强测中获得了满分。我想这只能认为是我运气比较好了。
课程收获
这这门课程中我最大的收获大概是学习了 Java 这门语言。尽管我之前就使用过一些与 Java 十分相似的面向对象语言(如 C#、Kotlin),对 Java 也有一定的了解,但在学习这门课程之前我并没有实际使用 Java 进行软件开发的经验,而在完成课程作业的过程中,我逐渐熟悉了 Java 的语法和特点,掌握了编写基本的 Java 代码的必要知识。
在此之外我还学到了一些杂七杂八的知识,比如 JML、UML 等,但遗憾的是我并不觉得它们在课程以外会对我有什么帮助。
改进建议
- 本次博客作业大部分要求实在有些抽象,对于我这种不会写作文水平较低的学生很不友好。
- 部分实验课及官方包提供的代码质量不高,甚至无法通过 Checkstyle 的检查。
- 课程网站有一定的改进空间,比如在进入某一次作业的介绍后无法方便地切换到其他作业,只能点击“所有课程”返回到最上层重新开始选择;只能提交测试后只能显示最近一次提交的结果也不太方便,希望能够看到历史提交记录。
- 第一单元和第二单元的性能分个人认为不是一个好的机制,尽管最后对成绩影响不大,但由于在完成作业时不知道具体占比和评判基准,会导致不必要的焦虑,有助长“内卷”之嫌。
面向对象设计与构造课程总结作业(代码片段)
BUAAOO2021THEFINAL面向对象设计与构造课程总结作业四个单元中的架构设计第一单元架构设计与实现相关总结,传送门在此第二单元架构设计与实现相关总结,传送门在此第三单元架构设计与实现相关总结,传送门在此第四单元架构... 查看详情
面向对象第四单元总结
面向对象第四单元总结写在前面第四单元的作业是关于UML图分析的作业,实现的功能包括对于三种UML图的分析以及对于输入的json内容错误查询,总体难度不大。主要的考察点在于对于数据分析的方法和对于某些数据结构(例如... 查看详情
面向对象第四单元总结——uml
...方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效... 查看详情
面向对象第三单元总结(代码片段)
第三单元总结JML语言的理论与应用(一)理论基础TheJavaModelingLanguage(JML)isabehavioralinterfacespecificationlanguagethatcanbeusedtospecifythebehaviorofJavamodules.ItcombinesthedesignbycontractapproachofEiffelandthemodel-basedspecificationapproachoftheLarchfamilyofinterfacespecif... 查看详情
面向对象第三单元总结(代码片段)
一、JML语言理论基础1.1 JML语言理论基础JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言。JML是一种行为接口规格语言,基于Larch方法构建。BISL提供了对方法和类型的规格定义手段。所谓接口即一... 查看详情
面向对象的第三单元总结(代码片段)
(一)梳理JML语言的理论基础、应用工具链情况梳理JML语言的理论基础在JML官网上,是这样定义JML的。Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 。它结合了Eiffel的契约方法设计 和Larch... 查看详情
2021面向对象第四单元作业
面向对象第四单元小结一.架构设计第一次作业在本次作业中,采用MyUmlInteraction类来实现代码的主体功能。第二次作业在本次作业中,采用MyUmlGeneralInteraction类来实现代码的主体功能。本次作业出于懒惰,直接将类图、状态图、... 查看详情
面向对象第三单元(jml)总结体会(代码片段)
一.JML语言定义Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为。它结合了Eiffel的契约方法设计和Larch系列接口规范语言的基于模型的规范方法。理论基础JML是契约式语言的一种具体表现形式。契约(Contact... 查看详情
2020面向对象设计与构造第三单元博客总结(代码片段)
面向对象设计与构造第三单元总结一、JML规格化设计JML,全称TheJavaModelingLanguage,是用于对Java程序进行规格化描述的注释性质语言。笔者在本文总结了常见的JML语法描述。1.注释结构在注释行或注释块中,以@开头的行被认作JML注... 查看详情
《面向对象程序设计(java)》第四周学习总结(代码片段)
第一部分第四章部分理论知识1.面向对象程序设计概述:java是完全面向对象的,必须熟悉OOP才能编写java程序。类:由类构造对象的过程称为创建类的实例。封装:封装是将数据和行为组合在一个包中,并对对象的使用者隐藏了数... 查看详情
第四章面向对象编程(上)(代码片段)
第四章面向对象编程(上)4.1面向对象(OOP)和面向过程(POP)4.2Java语言的基本元素:类和对象4.3对象的创建和使用4.1面向对象(OOP)和面向过程(POP)面向对象和面向过程二者都是一种思想,面向对象是相对于面向过程而... 查看详情
oo总结
...复杂度分析如下:架构设计及OO方法理解演进从最开始的面向过程到进入第一单元开始注意对象实体之间的关系,以及为实体的属性设置方法等开始培养面向对象的思维,了解面向对象所包含的一些思想和原则。进入第二单元后... 查看详情
面向对象第三单元总结
面向对象第三单元总结目录分析在本单元自测过程中如何利用JML规格来准备测试数据梳理本单元的架构设计,分析自己的图模型构建和维护策略按照作业分析代码实现出现的性能问题和修复情况对Network进行扩展,以及相应的JML... 查看详情
oo第四单元uml&课程总结(代码片段)
oo第四单元UML&课程总结一、总结本单元作业的架构设计 本单元的作业是写一个UML图的解析器,而具体的将UML图解析成一个个的UmlElement元素的过程已经在官方包中给出,我们需要做的就是对UmlElement中的元素进行组织与数据... 查看详情
王艳201771010127《面向对象程序设计(java)》第四周学习总结(代码片段)
第一部分:理论知识。第四章:对象与类4.1:类与对象的概念。类:是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。对象:想要使用oop,一定要清楚对象的三个特性:1)对象的行为:对象的行为使用可调用... 查看详情
面向对象第三单元总结(代码片段)
目录单元内容JML语法规格变量常用表达式方法规格类型规格JML工具链概述部署OpenJML部署JMLUnitNG架构分析bug分析互测心得与体会单元内容本单元的内容是实现一个社交关系模拟系统,通过各类输入指令来进行数据的增删查改等交... 查看详情
第四十一篇面向对象基础(代码片段)
面向对象一、面向过程和面向对象1、面向过程编程(思想)1.上一个函数的输出是下一个函数的输入,类似流水线,机械式、顺序化2.优点:逻辑清晰,将复杂的问题流程化,细化、步骤化,进而简单化3.缺点:可扩展性差2、面... 查看详情
面向对象第一单元总结(代码片段)
...心得体会第一单元通过三次迭代的表达式求导任务建立对面向对象程序的初步认识,并熟悉面向对象的思维和编程方法。一、任务需求三次作业的需求如下:第一次作业:求解简单多项式导函数第二次作业:求解包含简单幂函数... 查看详情