BUAA_OO_第四单元作业总结
BUAA_OO_第四单元作业总结
第四单元作业
总体概述
本单元的任务是迭代开发一个UML解析器,能够解析UML类图、UML顺序图、UML状态图,支持对这些图进行正确性检验并且通过指令对这些图一些特征值进行查询。本次作业旨在让我们更理解UML图中的元素间的关系,加深对UML类图、UML顺序图与UML状态图的理解,熟悉类图、时序图和状态图的基本元素和它们之间的关系,学习使用 StarUML,了解 StarUML 绘图方法,能够看懂简单的树形图。
总类图
因为本单元作业都是在上次作业进行增量开发,因此放出第15次作业的类图
架构设计
本次作业采用了分层解析的架构,将UML类图和UML顺序图中的元素分为三层进行解析,UML状态图层次较多需要分为五层,每次对所有UmlElement
进行循环,找出所有当前层的元素进行解析,并与前面解析的元素构建层次关系。通过逐层解析建立了类似第一单元的层次化结构,并以此为基础实现查询指令和正确性判断。
UML类图
UmlClass
、UmlInterface
、UmlAssoication
UmlInterface
、UmlOperation
、UmlGeneralization
、UmlAssociationEnd
UmlParameter
、UmlInterfaceRealization
UML顺序图
UmlInteraction
UmlLifeline
、UmlEndpoint
UmlMessage
UML状态图
UmlStateMachine
UmlRegion
UmlPseudostate
、UmlState
、UmlFinalState
UmlTransition
UmlEvent
架构设计思维与OO方法的演进
Unit1
本单元是对面向对象课程的初次接触。本单元强调对象这个概念,将复杂的表达式拆分成基本运算因子与运算方法,这些基本运算分子就是一个个对象,通过创建不同的类来对这些因子进行建模,最后通过运算法则对这些对象进行计算得到最终的结果。架构是分层次解析表达式并依层次创建出对应的对象与对象间的关系,最后按照对象间的层次关系进行计算化简。
Unit2
本单元是对多线程程序的初次接触。本单元旨在学习线程之间的协同设计层次架构,掌握线程之间的交互,强化线程之间的协同层次架构设计。本单元的主要架构是生产-消费者模型,同时还要尝试使用工厂模式实现不同电梯的创建。
Unit3
本单元强调规格化,是对契约式编程的初次体验。本单元所有要求实现的函数都通过JML规格的形式指定,只需要看懂规格并利用规格来实现。通过本单元的训练我体会到了规格设计的重要性以及契约式编程的优点。
Unit4
本单元以UML模型为基础,旨在帮助我们理解UML图中的元素间的关系,加深对UML类图、UML顺序图与UML状态图的理解,熟悉类图、时序图和状态图的基本元素和它们之间的关系。本次作业的架构与第一次作业类似,同样是将UML图形中的元素利用类来进行抽象并逐层解析建立起对应的层次关系,充分体会面向对象的思维。
测试理解与实践演进
在第一单元通过与python的sympy库进行比较来对拍测试,主要测试结果的正确性。第二单元除了自拍外也构造了很多边界情况机型测试,并且除了结果的正确性之外第二单元还要关注线程安全与cpu使用情况,这些需要通过类似JProfiler等工具进行测试才能发现。第三单元尝试学习了JUnit的测试方法,但最终还是进行了对拍保证了正确性,第三单元通过规格生成覆盖规格的所有分支的方式生成出来的数据在互测中取得了一定的成效,而debug也可以对照规格检查各个函数的实现,这体现了JML规格约束的优越性。第四单元主要还是同同学们对拍,同时生成边界数据的过程也增进了我们对UML图的理解。
总的来说,通过这么多次作业给自己的程序和互测阶段房内的程序做测试,我的测试能力有一定的提升,测试的手段主要是采取随机+构造的方法。
课程收获
- 通过这么多次作业的训练,我对于面向对象的开发思维有了更深的了解,能够将问题拆解成对象之间的问题,通过对象封装来进行设计,编写出来的程序符合开闭原则和单一职责原则。学习了一些使用的开发模式与架构,可以尝试进行多次迭代开发具有一定规模的代码的能力了。
- 学了许多实用的设计知识例如JML规格、UML图的绘制与阅读。也学到了很多实际开发中会运用到的知识例如多线程、线程安全的知识。
- 通过多次作业的测试下来我测试代码以及寻找代码中的问题并修复的能力也得到了不小的提高,能够对着一千多行的代码来构造数据找出代码的错误并修复了。
- 学会了更规范的代码书写风格,写出来的代码的可读性更高,不会像大一的代码那样回过头难以理解写了些什么。代码更具有层次化,也更具有课拓展性了。
- 抗压的能力也获得了一定的提高,第二单元最后一次作业我在星期六晚上七点才发现问题,在这最后一个小时紧急测试最终成功修复了bug。还有几次写代码写到星期五晚上很晚的时间,锻炼了应对困难任务的心态与能力。
改进建议
- 相对于后两单元的作业,前两单元的作业难度更高,也更具有挑战性。可以尝试在后两次作业中也加入一些开发模式相关的内容,能够多接触一些不一样的开发方式。
- 可以稍微提高一点强测的难度,让强测的梯度更明显一点。有些时候在互测阶段并没有使用很强的数据就找出好几份作业的bug了,甚至会出现一交数据就成功hack的情况,这对于互测阶段还是不是很友好的。
- 增加一些测试相关的知识,以鼓励更多的同学去构建自己的测评机,进一步提高测试能力以及代码能力。