面向对象第四单元总结

第四单元的任务是实现一个UML解析器,支持对UML类图、状态图与顺序图的分析,并能根据UML规则进行规范性验证。第十三次作业实现了对类图的分析,第十四次作业增加了状态图与时序图,而第十五次则在读入指令之前进行了规范性验证。三次的目标较为独立,在迭代开发上较为简单,不像前两个单元一样可能需要推翻重构。

一、本单元架构

本单元作业的架构思路如下:

image

各项指令的功能可大致归纳为查找与统计:通过name与id查找相应对象,统计类中的操作数、状态机中的状态数等数据。故将读入数据处理如下:

  • 首先依次分析传入的UmlElement,并分类存入ArrayList。
  • 此时的数据已经能够分析,但遍历效率极低,需要通过HashMap对UmlClass、UmlInterface等对象进行索引,以便通过id与name信息快速查找。同时可统计重复出现的命名,当查找相应对象时可直接抛出异常。
  • 对部分类型专门建类存储相关信息:针对每个UmlClass对象生成一一对应的ClassData对象,其中存储子类数量、父类id、接口、方法与AssociationEnd;针对UmlInterface建立InterfaceData,存储其继承的接口id信息;针对UmlInteraction建立InteractionData存储其中的lifeline;针对UmlRegion建立RegionData存储各状态与Transition,并将Transition解析为状态id的对应关系。此时可解析继承、实现接口、关联等关系,在相应类中直接表示。
  • 查询时,通过id或name便可定位对象,避免遍历UmlElement查找对象或分析关系。

第十三次作业

​ 本单元的第一次作业花费了不少时间,主要在于阅读手册、学习UML的代码、理解单元的需求。代码上经历了从最早完全不对数据进行预处理以至于超时,到逐渐建立起索引体系、形成最终程序的过程。而在作业完成之后,我对本单元的任务也有了一定的理解与把握。

第十四次作业

​ 第十四次作业增加了两类图与相应的6个查询指令,主要的精力花在了两个方面:一是学习状态图与顺序图,因为之前分析程序架构都使用了类图,相比之下状态图与顺序图就陌生了不少,对其中各元素的了解也有所欠缺;二是调整架构,因为UmlImplement类超过了500行,调整方法为将参数处理单独建类,避免单个类承担过多任务使得架构混乱。

第十五次作业

​ 第十五次作业增加了判断输入数据规范性的功能,修改简单,除判断多继承与循环继承需要分析算法外,其他检查都比较明了。

二、OO课程总结

架构

​ 第一单元的架构设计过程记忆犹新,在架构设计上花费了不少精力,因为当时对面向对象思维完全不熟悉。好在课程组提供了递归下降法的思路与大量代码,我的程序便是以此为基础编写的。而增量开发的模式突出了架构设计的重要性,当架构不足以完成新的任务时便不得不重构。幸运的是,我的架构没有太大的问题,也就并没有在重构上花很多时间。

​ 第二单元是著名的电梯单元,重点在于设计模式与多线程。设计模式上,生产者-消费者模型在程序中得到了深刻的体现与应用,而在练习作业中也实践了单例模式等其他设计模式。本单元也是我第一次真正意义上的编写多线程程序,涉及到线程的同步与互斥时,就需要考虑线程安全等单线程完全接触不到的内容。

​ 第三单元对架构设计要求不高,因为官方包中已经完成了相关工作,只需要对应JML将代码翻译出来即可。本单元某种意义上更加侧重于算法的设计,如果仅仅按照JML规格,许多方法复杂度过高,是很容易超时的。

​ 第四单元刚开始接触的时候给人的感觉和第三单元挺像,都是按照需求完成若干方法。但着手编写后,二者的区别还是不小,本单元的综合性更高,需要设计整个数据存储模式、完成查找与统计。作为最后一个单元,本单元可以说是对课程所学知识的综合应用。

测试

​ 我的测试思路向来是针对程序的各个流程与数据的边界情况,辅以随机数据的测试。例如第一单元按照未知数、常数、括号、指数、函数、最终化简等着重测试,并进一步检查其中二者或多者组合时的特殊处理;第二单元测试运行时间与横向停靠位置;第三单元针对复杂度高或没有条数限制的指令构造数据测试时间;第四单元分析数据处理逻辑。后通过随机数据增大覆盖范围,检查是否存在未曾想到的错误。

收获

​ 本学期写了这么多代码,毫无疑问收获了编写程序的能力,无论是所开发程序的代码量、功能的复杂程度还是对Java语言的使用能力都得到了锻炼。而最重要的,便是对面向对象编程思维的学习。对比之前编写的Java程序、甚至是第一单元费尽心思完成的程序,差别尤为明显。此外,强测+互测的课程模式,也让人积累了更多测试的方法,留下了深刻的印象。

建议

  1. 希望能修改checkstyle的部分规则,import不用通配符使得导入占用大量行数,对文件长度造成进一步压缩,如果某个类在逻辑上确实需要近500行的规模,为同时满足import与文件行数的要求,需要将该类强行拆开,处理上增加了麻烦。
  2. 个人感觉对UML的应用不够到位,预习中的相关讲解较少,平常使用也是总结时对着已经完成的代码画类图、甚至可以自动生成,课程中类图的重要意义与实践中的应用情况不是很匹配。
  3. 对于第三单元的JML规格,可以额外增加自然语言描述。部分复杂方法的规格本身带有算法,阅读时注意力集中在分析JML的处理流程、根据算法归纳需求,耗费不少精力,而对JML本身的规范与应用的理解不够透彻,个人认为这一点存在不合理之处。