BUAA_2022_OO_第四单元与课程总结

第四单元作业的架构设计

本单元的主题是解析UML模型,主要难点是理解UML模型中各个元素的意义、作用,以及元素之间的关系(根据parentId等建立起树形关系);代码实现方面相对简单,因为文件解析这一难点已经由课程组解决,我们只需要利用现成的信息建立模型即可。

第十三次作业

这一次作业的目标是实现一个 UML 解析器,使其支持对 UML 类图的分析,可以通过输入相应的指令来进行相关查询。

在本次作业中,我建立起了解析器的基本结构,在理解类图元素的基础上,通过多次遍历,每次提出一些元素,提出顺序的基本原则是提出的元素的parentId指向的元素一定已经被提出。在这一过程中,考虑到所有元素ID的唯一性,我使用hashmap,把ID作为key值,简化对元素的查询过程。本次作业元素的基本提取层级如下图(UmlAssociation和UmlAssociationEnd在本次作业中未涉及),在一次次提取中建立起元素之间的树型结构。

第一层 第二层 第三层
UmlClass UmlAttribute UmlParameter
UmlInterface UmlOperation
UmlGeneralization
UmlInterfaceRealization

对于之后的查询指令,大抵可以分为两种:第一种可以在建立树型结构的过程中,逐步计算出查询结果,指令来到时直接返回结果;第二种是只有当所有元素信息均已被提取才能计算结果,当查询指令到达时才进行计算,并对结果进行缓存。

第十四次作业

本次作业的目的是扩展 UML 解析器,使其支持对 UML 类图、状态图和顺序图的分析,可以通过输入相应的指令来进行相关查询。
与上一次作业没有本质区别,状态图和顺序图的元素提取顺序如下(需注意UmlAttribute的parentId)。

状态图:

第一层 第二层 第三层 第四层 第五场
UmlStateMachine UmlRegion UmlPseudostate UmlTransition UmlEvent
UmlState
UmlFinalState

顺序图:

第一层 第二层 第三层
UmlInteraction UmlLifeline UmlMessage
UmlEndpoint

第十五次作业

本次作业的目的是扩展 UML 解析器,使其支持对 UML 类图、状态图和顺序图的分析,可以通过输入相应的指令来进行相关查询,并能根据 UML 规则进行一定的规范性验证。
根据之前建立起的结构对UML模型进行规范性验证,这次作业的难点在于对“规范性”的理解,整体层次结构没有变化。类图提取的元素增加了UmlAssociation和UmlAssociationEnd,如下图。

第一层 第二层 第三层
UmlClass UmlAttribute UmlParameter
UmlInterface UmlOperation
UmlAssociation UmlGeneralization
UmlInterfaceRealization
UmlAssociationEnd

架构设计思维及OO方法理解的演进

本学期的四个单元强调架构设计及OO思想,让我们在一次次实战中结合课上的理论内容,理解运用架构设计与面向对象思想。

第一单元的目标是实现一个支持未知数、多层嵌套、三角函数的表达式解析器。这是我认为最困难的一个单元,因为刚刚接触JAVA语言和OO思想,理解类、对象的作用和意义耗费了许多时间。本单元使用递归下降法进行架构设计,在建立好因子、项、表达式等类后,将输入的表达式中优先级高的运算符提出,把表达式拆分成两部分,重复以上过程,直到不存在运算符,在按照拆解的顺序把表达式合成达到化简的作用。总体上讲,在这个单元我对面向对象思想有了基本了解,学习了递归下降这种架构设计方法。

第二单元的目标是模拟电梯运送乘客。这一单元的重点是多线程思想的理解,由于此时操作系统还没有介绍相关概念,因此这一单元的第一次作业我基本是对着CSDN上的各种套路代码完成的,在之后的两次作业中理解了wait-notify机制,了解了维护线程安全时需要考虑的各种因素。除却多线程思想,我还在本单元的迭代中感受到了降低类之间耦合度的重要性,高耦合度使得每一次优化都好像重构。

第三单元的目标是按照课程组给出的JML描述写出符合要求的函数。这是我认为最简单的一个单元,因为JML语言可读性极强,而且只要根据课程组给出的“契约”完成函数。我认为本单元的重点是JML语言背后的思想:只要给各个函数规定好职能,就可以把顶层设计和底层实现分离,使得程序员的编程效率和正确性大大提高。

第四单元的目的是实现一个UML解析器,使其支持对 UML 类图、状态图和顺序图的分析。代码部分比较像第一单元表达式解析后合成的部分,相对简单。重点在于理解三种UML模型,我认为这三种模型很好的体现了面向对象思想,把所有需要管理的部分抽象为一个个元素,分别进行管理,不必考虑其具体内容。

随着学习的深入,我越发感受到面向对象的方法天生适合工程化的开发,通过将支撑满足需求的结构抽象出来,开发者可以从不同的逻辑层次审视工程结构,而每一层次得以保持简洁清晰。这样的特点不仅有利于减少大型项目下的bug,更有利于多人的协同开发以及甲乙方之间的需求沟通。

测试理解与实践的演进

每个单元测试的基本结构都是数据生成、程序运行、输出检查三个部分。

数据生成包括手动构造和自动生成两大方式。自动生成的特点是数据量大、随机性强,适合用于检测程序的基本正确性;手动构造适用于检查边缘条件的正确性,以及构造复杂逻辑结构检查程序的性能。一般来讲,这二者不可偏废,然而测试只能证明有错误,想要正确性还是要在程序设计时下功夫。

程序运行部分比较简单,且各单元类似,不再赘述。

检查输出的方法在各个单元都不尽相同。第一单元表达式化简可以使用现成的python库辅助检查;第二单元电梯输出的正确性需要满足一定的规则即可,因此可以编写相应程序直接验证,然而编写出的检查程序的正确性也难以保证;而第三、四单元输出的正确性与个人对需求的理解正确与否关系很大,按照错误理解编写的正确性检查程序自然是无效的,因此可以选择和同学对拍,这是一种高效、简单的方式,也存在相同错误这一风险。

课程收获

  1. 学习了JAVA语言,掌握其基本语法,并经历了一定实战。
  2. 了解了面向对象思想,学会利用继承、多态等特性对事物进行抽象;
  3. 学习了多线程编程的基本方法。
  4. 学习了JML语言和UML模型,我认为他们在工程方面有很强的应用性。
  5. 了解了例如SOLID原则的一些编程思想与哲学。
  6. 学习了对git的运用。
  7. 学习了如何搭一个简单的评测机。

三个具体的改进建议

  1. 第三单元的内容相对简单,且后期作业的重点在于算法而非JML,可以适当减少迭代次数。
  2. 希望可以系统性地讲解测试的目标,以及搭建评测机的基本方法与注意事项。
  3. 研讨课小组分享中同学们对相同问题往往有重复的观点且时间紧张,而对不同的问题又缺少思考,可以减少每次上台的小组个数,剩下的小组以提问的形式进行参与。
posted @ 2022-06-28 14:46  现充宅  阅读(14)  评论(1编辑  收藏  举报