BUAA OO 2022 第四单元总结

一、第四单元架构设计

1、架构图

类图

状态图

顺序图

主类图

2、架构分析

本次作业本来打算在MyImplementation内实现各个指令的主要过程部分,但在第三次作业的时候发现如果坚持这种思路,MyImplementation的总行数将会超过500行,因此决定构建Tools类,将isTo*(将id转换为自设对象)、getTarget*(寻找目标名称的自设对象)以及指令的综合执行部分放入Tools内,将复杂的具体计算,例如循环继承、重复继承、耦合度计算、关键状态判断等具体实现方式放入相应的自设对象(MyClass、MyState等)中。讲过这样简单的重构后,MyImplementation可以看做一个各个指令的接口,同时MyImplementation还负责对输入的模型进行分类工作,保存顶级对象,将各个下级对象传入上级对象进行层次化处理,由于对象类型众多,因此MyImplementation的初始化分类代码占据了300行左右。

同时,为了防止重复输入复杂指令导致的超时,我采用了动态规划的思路,将每一个已经被指令查询过的数据作为一个变量或数组中的元素存储下来,下一次查询相同对象时,先判断答案是否已经存储再决定是否需要进行复杂计算。

本单元作业在指令部分,仅仅是在实现过程方面需要思考时间较长的我认为时寻找关键状态指令,我采用的是在初始化时就对每一个MyState是否是关键状态进行,从初始状态出发,分别不考虑每一个MyState看能否在限制步数内到达结束节点,由于采用了动态规划思路,因此这种复杂的多重遍历仅需执行一次即可。

在合法性方面,需要注意的便是接口循环继承的寻找,我采用的时深度遍历的思路,虽然合法性检查不必担心多次输入指令导致的超时问题,但为了节约性能资源,我在理论上验证了:以总节点数为深度限制,从任一个节点出发开始遍历查找循环继承,能够寻找出所在分支的所有循环路径,因此可以用遍历的第一个节点的数组序号作为确定该分支中加点是否为循环继承的时间,一旦一个节点已经在更早的时间被确认,那么可以将该节点在本次遍历时在逻辑上“删除”,从而大大减小了重复遍历导致的资源浪费问题。

3、bug总结

本次作业三次强侧都是未发现bug,只有在第三次作业的弱侧发现了两处bug。

R003:用MyInterface.getCircle表示该接口被确定为循环继承的时间,初始化时将getCircle设置为0,第一轮设置时也将getCircle设置为0,导致设置混淆。更改为初始化为-1。

R004:获取接口继承的所有接口时,重复接口未重复获取,导致若某一个接口重复继承,继承该接口的另一个接口无法看做重复继承。

二、设计思维演进

第一单元设计思路只要在于层次化,最开始是参考练习内容对于层次化的具体方式有了一个较为明确的了解,之后的扩展主要在于逻辑设计的完备性,同时第一次互测也让我认识到数据类型不可忽视。虽然逻辑设计的完备性短短一句话,但是由于表达式分析采用的递进式构造与处理,导致必须关注每一处运算符以及运算符在不同位置时的格式注意事项,兼顾工作量与逻辑上的细心程度。本单元的设计要点在于层次化、完备性。

第二单元电梯设计我在一开始就严格遵守死锁预防的思路,因此这方面到没遇到什么bug,但是几乎每次强侧都会CPU超时,也让我认识到了性能的重要性,这需要重点关注整体的调度逻辑、线程之间对于while的协调问题。本单元的设计要点在于协调性、整体规划。

第三单元JML单元在大的架构上没有什么自主发挥的空间,但在具体函数上可以通过自定义类进行简化,我遇到的核心问题在于指令大量重复造成的性能问题。本单元的设计思路主要在于动态规划。

第四单元完成UML层次化架构即可。本单元的设计思路主要在于层次化。

三、测试理解演进

在第一单元,测试的内容主要在于对数据类型的使用、表达式处理的正确性、逻辑的完备性这种基本规则与功能正确性的测试。

在第二单元,测试的内容主要在于多线程的死锁与轮询问题,通过随机生成的大量数据来“撞”或通过针对性的巧妙构思来用少量指令实现测试;同时由于电梯运行的特殊性,调度策略也是一个测试重点,需要从全局的运行时间上来考虑,有时可能为了实现的简便而忽视了总体的运行时间,这种通常采用大量随机指令夹杂精心设计的指令进行测试。

在第三单元,测试的内容主要在于性能测试,由于存在大量重复遍历的代码,同时每个指令的答案可能会被其他指令所改变,导致不能使用简单的动态规划来节约性能,在动态规划的同时,需要建立一个能够使得改变一个变量导致的局部重构对时间资源浪费较小的架构模式。处于这种思路,本单元测试通常使用随机生成的上千条关键性能指令及相关指令进行测试是否运行超时或cpu超时。

在第四单元,自主测试的内容主要在于对题目描述的理解上的正确性进行确认,难度上相比前三个单元较为简单。

四、课程收获总结

面向对象这门课程通过四个单元,分别教授了四个主要内容。

第一单元表达式化简的核心思想在于层次化、规范化。通过实践让我认识到层次化对于项目后续的拓展与解读的便利性;互测时的圣杯战争让我认识到设计程序时,一定要尽可能地将题目解读清楚,了解并考虑到所有可能的输入方式以及相应的处理方式,优势也许只是加一个括号、换一个数据类型的这种低级错误可能在debug的时候需要耗费大量时间。

第二单元电梯设计的核心思想在于多线程之间的协调问题以及整体规划思想。多线程中的每一个while、notify、wait都需要经过仔细思考与逻辑验证,轮询造成的cpu空转导致cpu资源大量浪费,多线程死锁导致的程序无法执行问题,这些多线程问题造成的后果在项目越大的时候,造成的后果就 越严重。这需要我们在写项目的时候,不能一开始就埋头敲代码,而应该先整理出一个清晰的逻辑思路,可以避免许多问题。

第三单元JML解读实现使我从零开始到深入了解JML语言,在实现方法的过程中认识到符合规范的JML注释对于代码实现的帮助有多么大;同时也进一步认识到,代码的实现具有极大的灵活性,截然不同的到吗也能实现相同的功能,同时如果有需要,可以适当在规范之外增加便于实现代码的自定义类;对于自定义异常的设计让我清晰地认识到了java异常抛出的基本原理;部分需要遍历才能实现的指令,也让我继大一之后再次认识到一个好的算法与处理逻辑对节省计算机资源的重要性。

第四单元让我对于题目的解读更加驾轻就熟,也让我对UML模型的整体架构有了一个清晰的认识。

五、具体建议

1、希望对于自动化测试有一个系统的、有效的讲解,我目前的“自动化测试”只是停留在随机生成数据、对拍这种简单测试的层次。

2、希望有时候实验仅需提交answer.json文件的时候可以不要出现编译错误的报告,可以对仅需answer.json文件的提交判断是否有这个文件直接输出提交成功或失败。

3、预习部分可以稍微增加些内容,减少一二单元的负担。

posted @ 2022-06-26 12:38  璇璃  阅读(25)  评论(0编辑  收藏  举报