BUAA OO 第四单元总结

综述

  学期终于结束了,oo也结束了最后一个单元的学习。本单元主要考察对UML结构图的解析与理解,通过对UML图的解析学习UML的各种规范。通过本学期oo课程的学习,我逐步地深刻地体会到了面向对象编程的内涵,系统地提升了面向对象编程的规范语言、性能分析、测试水平等。

一、 本单元架构分析

  本单元的重点在于对UML图的理解和解析,对正确性要求较高,对性能几乎无要求。因此在本单元的设计架构中,我的架构思路相对比较基本。通过多次遍历数据中的给定元素依次将特定种类元素信息进行提取并构图,边构图边将所考察指令所需信息进行提取和更新,对于类实现的全部接口、类的继承深度等需要遍历查找的指令,在构图时进行递归更新。构图完成即为这些指令的相关信息已经处理完毕,当查询时直接提取答案即可。

  而对于无法通过递归更新的其他指令如检测环的错误、关键状态等,在调用查询方法时进行计算并缓存。由于性能没有过多要求,因此在本单元我多次使用遍历进行提取或查询,为了避免重复遍历,采取标记图对遍历完成的点进行标记,在当前遍历过程中不再遍历该点。

  UML各元素提取顺序大致如下。

第一次 第二次 第三次 第四次 第五次
UmlClass UmlOperation UmlParameter UmlTransition UmlEvent
UmlInterface UmlGeneralization UmlInterfaceRealization UmlMessage  
UmlStateMachine UmlAttribute UmlPseudostate    
UmlInteraction UmlRegion UmlFinalState    
  UmlEndpoint UmlState    
  UmlAssociationEnd UmlLifeLine    
    UmlAssociation    

  

 

   本单元作业UML类图架构大致如下。

 

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

  第一单元主要考察表达式的解析与化简。本单元的架构设计思维主要采用递归下降法。虽然在假期中认证学习了课程的预习内容,掌握了一些基本的利用Java类和对象进行编程的知识,但当真正第一次面对这种大规模,具有复杂且深层次结构的项目设计时,在思索其架构设计时依然困难重重。第一单元练习提供了正则表达式解析与递归下降法两种方法,经过了很长时间思考,发现正则表达式解析、后缀表达式直接解决等方法既不具有很清晰的思路,有一定的思维漏洞,同时也不利于后面的迭代开发。通过将表达式拆分成表达式、项、因子三个大概层级,通过符号将各层级解析并不断递归直至最基本的mx^n形式。使用基于面向对象的递归下降法进行设计,我真正体会到了面向对象方法的便利与严谨,体会到了对象化设计的魅力。

  第二单元主要考察基于多线程的电梯调度实现。由于同时执行线程的道数由一变多,使得程序运行情况愈加复杂。多线程的出现也不可避免地出现影响正确性的同步互斥问题与线程竞争问题。本单元的架构以电梯调度算法、wait-notify机制和同步锁思维为核心,纵向电梯采用LOOK算法而横向电梯采用ALS算法,整体电梯竞争采取自由竞争策略。为了解决同步互斥问题,在对每层的等待队列进行处理的方法进行加synchronized同步锁。通过这一单元,对于多线程的wait-notify机制有了更深刻的理解,以及对多种极端情况的分析、正确性保证和性能优化有了更深刻的实践。

  第三单元主要考察基于JML的代码实现。本单元的架构设计为围绕JML的功能描述进行具体实现,重点在于JML仅仅是规定了职能与约束而并不限制具体实现方法。在具体的实现中,除JML规定的方法实现外,还使用了并查集、堆优化的多种经过优化的图论算法、实时更新并缓存等方法以提升执行大体量指令的性能。通过本单元的学习,能够准确理解JML语言的含义与内涵,体会到了面向对象方法的规格化设计理念,也充分体会到算法以及算法复杂度优化的魅力。

  第四单元主要考察对UML图的解析与理解。本单元的架构设计基于UML图的各种元素,对相关元素进行所需信息再处理与构建各种所需关系图,基于预处理后的信息进行校验与查询。通过本单元的学习,对面向对象的层次化设计思想有了更深刻的实践与理解。第三单元和第四单元均对多种类型元素的所需信息进行封装,对结构进行抽象,充分体现了面向对象思维。

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

  在第一单元中,我更多是依靠自己对于极端情况的分析手动构造测试样例进行测试。第二单元中,由于多线程的出现以及数据量的加大,需要的数据规模与情况更加复杂,在测试中采用了基于一定极端策略产生测试数据的方法,但这个方法在该单元并没有广泛使用,更多的还是手动构造与测试,且在测试中更注重正确性和性能的同等地位考察。而第三单元,由于结构简单且数据易于构造,我第一次全面尝试了自动化测试的实现,从随机生成或策略生成数据到投送运行到对比答案并记录时间,也体会到自动化测试的高效与便利。第四单元由于自动化测试掌握并不精通,再加上UML图结构较为复杂,难以保证自动生成数据的覆盖度,因此在本单元自动化测试并不是主要测试方法,更多是基于代码逐步分析构造极端情况样例进行测试。

  除了基于数据的测试,基于代码实现的测试同样必不可少,在写完代码一段时间后,应该回过头来逐步分析自己的代码实现,在这一过程中能够发现绝大多数问题,基于数据的测试更多应该是基于代码实现测试的补充实现。

四、 课程收获

  OO课程给我带来的最大收获可能是代码风格的注重。通过本学期的学习,对代码风格的检查逐渐成为了习惯,在自己编写程序的过程中,从一开始代码风格检查中溢出屏幕的错误到后来代码风格只需要改很少的部分,我的代码风格有了很大程度的优化。此外,优秀的代码风格也为我阅读自己的代码提供了更方便与清晰的环境,更加容易通过阅读代码发现自己的问题。
  OO课程的收获自然有面向对象思想和编程知识的更深刻理解。通过本课程学习,体会到了面向对象编程的便利性和层次性,学会将不同类型所需信息进行适当的抽象和封装,合理利用继承、多态等简化自己的代码实现并使架构更加清晰。学习了基本的Java编程语法、多线程实现以及多种经典算法的应用与优化,充分领会到JML蕴含的规格化设计与UML蕴含的层次化设计的重要作用,对程序正确性和性能的考察更有抓手。

  此外,在OO课程中,我也收获到了与同学分享与合作的快乐,也感受到了助教和老师孜孜不倦,热心解决问题,为我们的代码实现保驾护航。更多的分享与合作极大的提升了完成任务的效率和效能,更容易做到完成得快,也完成得好。

五、 建议

  1. 在第一单元中可以有更清晰的引导。第一单元是课程正式开课接触的第一个单元学习,此时同学几乎刚刚接触面向对象思维,如果在第一单元中缺少必要引导甚至是误导,很有可能出现不必要时间的延误甚至耽误课程进程,也带来了不必要的巨大压力。如第一单元训练既提到了正则表达式直接解析又提到了递归下降法,第一种方法几乎没有用到,在第一次作业的思索过程中对第一种方法可行性的思考耗费了大量时间,理解和实现递归下降法的过程又十分复杂,险些导致没做完。如果第一单元的高难度是必要的,那么应该给予更多更清晰的引导。
  2. 增加关于面向对象编程测试的教学单元或教学课目。在面向对象编程的实践中,测试有着至关重要的作用,但在实际进行测试的过程中更多是靠自己的摸索,缺乏科学理论的指导,导致可能有许多的测试思想被遗漏。
  3. 提升中测强度。在某些中测数据中,其结构过于简单,导致几乎起不到检测bug的作用,中测的强度甚至与弱侧的强度相似,显然这样的中测一定程度上失去了意义,有可能误导同学的心态。越来越多这样的中测的出现,也可能会引起同学对测试意义的怀疑。
posted @ 2022-06-28 23:30  伊尔卡米诺  阅读(27)  评论(0编辑  收藏  举报