OO第四单元总结

  第四单元的作业主要是围绕UML类图的解析进行展开。从第一次作业简单的类图查询到第二次作业的有效性检查、顺序图、状态图查询,相比于前几次作业,难度其实不是很高。

一.作业架构

  第一次作业就是实现在类图上的一些查询操作,主要的难度其实在umlClass、umlInterface向上递归寻找父类,只要对这两个对象实现向上逐层寻找父类并将父类存储起来的话,这个作业基本就实现完了。但是我刚开始的时候没有考虑到这个,在程序快实现完成的时候才想到。整个程序在设计的时候贯穿了单一功能的思想,将对同一个对象的方法集成在一个类中,针对不同对象的方法分开在不同的类中。数据结构的使用也是这次作业考察的一个要点,为了实现什么功能使用相应的数据结构,这次作业中大多使用的都是嵌套的HashMap、HashSet。程序的类图如下:

  ClassOpCount是计算类图的对应类型的操作数量的类,ClassAttCount是计算类图中对应类型属性的类,InterfaceRealize是计算类图中实现类列表的类,TopClass是计算类顶级父类的类,AssociationCount是计算类图中关联数量以及关联列表的类。总体上来说实现起来算法上比较简单,实现上有点冗余的感觉。

  第一次作业中还是存在一些比较严重的bug。最严重的一个bug是设计上的错误,应该使用id去作为key值去存储相关的数据,而程序中为了方便使用的是name,导致在强测中一些失分。还有就是空指针的错误,在取值的时候未判断是否存在相应的值。这些bug在强测结束之后都进行了修改。

  第二次作业除了第一次作业中类图的查询之外,增加了有效性检查以及对顺序图状态图的一些查询操作。对顺序图状态图的查询操作只要理解了顺序图和状态图便是比较好做的,主要是有效性检查中的二和三比较难做。其中有效性检查二使用的是tarjan求强连通分量的算法。在存储的过程中,继承关系的数据结构就是一个邻接表,所以图中要是有size大于1的强连通分量,便是循环继承,实现起来还是比较简单。有效性检查三是在计算一种比较复杂的计算方式,在计算类的实现接口的时候将结构分别存储在HashSet和ArrayList中去,比较两个数据结构的大小,如果不一样的话就是存在重复实现,同理类的继承父类和接口的继承一样存储两个数据结构最后比较大小。在整个设计上,将所有的数据结构拿出来实现了一个data类,并实现了相应的接口,使整个程序看起来更具有单一功能这一特性。程序的类图如下:

 这一次作业中关于状态图和顺序图的查询过程中,所有的功能几乎只要将数据结构写好就可以实现查询,所以就没有对他们有相关的类。check是三次有效性查询的类。

二.架构设计以及OO方法理解的演进

  从第一单元到第四单元也总共实现了大大小小11次oo作业。每次实现的时候感觉都不是非常的一帆风顺,但是每一次实现的过程中都是有很大的收获的。

  第一单元由于是第一次完整的接触面向对象编程,所以在实现的过程中还夹杂着很重的面向过程的编程思想。尤其是在第一次作业中,明显提示使用正则表达式,因为懒的学习还是使用了非常复杂的状态机去识别函数。第二次作业使用了正则表达式,还可以很勉强的使用面向过程的编程思想去实现,其实已经非常困难了,第三次作业就完全不会做,最后在大佬的架构建议下,才第一次领悟面向对象的思想,也第一次领悟了数据结构在JAVA语言中的重要性。这也正是第一次作业训练的目的吧,转换编程思想,熟悉JAVA面向对象编程,确实在之后的编程中,我更注重在写程序之前的架构,会思考很多该如何设计程序。

  第二单元是对线程的练习。多线程也是JAVA面向对象编程思想中重要的一个环节。第一次作业中老师给了一种架构的思想,此后的三次作业都是在此基础上实现的。本单元除了了解多线程的实现方式之外,更重要的是掌握实现线程安全的方法。如何使用synchronized、wait等去对相应的对象加锁、开锁等等。

  第三单元是对jml的练习。由于规格已经给出,所以完全按照规格去实现方法、类基本就可以。也是在这一单元的练习中了解到了活用数据结构的重要性,不再是一个数据结构使用到底,为了完成相应的功能而使用相应的数据结构。但其实按照内容来看,第三单元的作业其实是对图算法的一种练习,练习最多的便是最短路径算法,虽然在这一算法上吃了很大的亏。

 第四单元是对UML类图解析的练习。这一单元由于并没有给出过多的关于类图、状态图、顺序图的参数讲解,所以很多都是自己手动在starUML中画出来。最后看官方jar包解析出来的数据得出的结论。架构上主要是遵循单一功能的思想,将针对不同对象的功能实现在一个类中,这样无论是在debug阶段还是在后续的修改阶段都十分方便。这一单元也算是一个图算法的练习,也对数据结构的使用进行了训练,将“完成什么功能使用相应的数据结构”体现的淋漓尽致,有些查询只要数据结构到位就很简单。

三.测试理解与实践演进

  从第一单元到第四单元的测试基本上都是手动编写测试样例,然后进行测试,再根据结果去分析程序中的bug。有时候对指导书中的某些意思理解的不明确,便会去找大佬讨论,得知问题之后在回来对程序进行语义分析,修改程序的bug。在第三单元的时候要求使用单元测试,由于使用起来感觉不是很便利,只是加了一个输出结果的比较工作,所以之后的作业中便没有在使用单元测试的方法。在测试的时候最好多和其他人交流一下测试样例,因为有时候自己写的测试样例是完全按照自己的本程序的编程思想走的,会有测试盲区,跟其他人交流之后,便很容易发现自己的测试盲区。这一点我是在第四单元的第二次作业中体会到的,跟大佬交流测试样例之后,便很快的发现了自己的bug。

  但是其实单元测试提供的结果对比还是很方便的,只是配置起来确实很麻烦,有时候会出现莫名其妙的配置失败。之后还需多加练习。

四.课程收获

  课程收获其实蛮多的。总结起来的话有以下几点:

  1.了解并实现面向对象的编程思想。之前的书写确实很过程化,按照事件实现的顺序实现程序,经过一学期的练习之后,确实感受到了JAVA这种语言机制的便利性。在做其他大作业的时候也很刻意的对程序进行了架构,确实效果不错。

  2.熟悉了JAVA语言。之前虽然潦草的看过JAVA入门书籍,但是通过这一学期的练习,确实比之前熟悉了JAVA语言。JAVA语言太过于庞大,还有很多值得去探索。

  3.代码规范有所提高。之前的代码风格一直很诟病,自己也知道,想什么时候打空格就打,没打就算了。经过一学期的练习之后,无论是在JAVA作业中还是在其他C语言编写中都很注重自己代码风格,好像这种风格与自己融为一体,代码的可读性增加了不少。

  4.了解了一些其他测试代码的工具。比如Jprofiler、Junit等等。虽然使用的不好。

  很感谢有OO这一门课,确实教会了很多。也让我看到了自己还有那种不AC不睡觉的劲头!(虽然强测都不是很好,不过bug我都修好了。)

五.改进建议

  1.课上的实验可以与作业相关。像计组、操作系统一样,在课上测试对同学实现的代码增加功能要求,其实每次作业中增加要求的余地还有很多。现在这样的课上实验确实感觉可去可不去,但是为了分数还是得去。

  2.改变课题。面向对象是一门练习面向对象编程思想的课,因为JAVA现在还是很主流的一种语言,所以我感觉可以和市面上的工作项目接轨,这样不仅可以练习算法、编程,还可以更好的让同学知道这门课程的重要性。

  3.难度分级。可以像编译课设一样,分级难度,虽然这样可能会增加课程组的压力。

posted on 2019-06-22 16:32  LZD1998  阅读(121)  评论(0编辑  收藏  举报

导航