目录
第四单元作业架构分析
第十三次作业
本次作业涉及到描述UML类图,所以在官方接口的基础上,我自己建了类图的层次结构,如下图所示:
其中,各个类的功能为:
MyUmlInteraction
类存放查询方法,以及从Id查找各个UML元素的map。MyUmlClass
类存放UmlClass元素,该class所含方法的Id,所含属性,相关联的类或接口的Id,一个父类Id,多个子类Id,实现的接口的Id。MyUmlInterface
类存放UmlInterface元素,该接口所含方法的Id,相关联的类或接口的Id,多个父接口的Id,多个子接口的Id。MyUmlOperation
类存放UmlOperation元素,以及该方法包含的各个参数。
可以看到,我把所有非底层(即包含其他元素)的UML类图元素全部建了类来存储。这样,通过Id索引将类图建立为树状,便于DFS查找等。
第十四次作业
本次作业在上次作业的基础上,新增了UML状态图和顺序图的查询,以及UML规则的检测。所以,对于每一种图,我都像上一次作业那样,分别建立层次化结构。类图如下所示:
各个类的功能和上次作业类似,在这里不一一介绍了。
总体来说,我觉得这两次作业的架构和思路还是比较清晰的,通过各个类之间的关联和索引结构,可以有效地查找和便利,实现各种查询和检查功能。
我的OO设计的演进
第一单元——多项式求导
在第一单元中,我初步了解了面向对象设计这个东西,并开始了初步尝试。但是现在回头去看当时写的代码,真的是非常的面相过程了,举个最简单的例子,多项式的toString
和求导方法我是在一个函数中完成的,而不是分层次去完成,这就导致我那几个函数非常长,看上去也很难受。
第二单元——多线程电梯
本单元我初次接触了多线程的设计,并在练习多线程设计的同时,进一步提升了自己的OO设计,本单元中我开始尝试分层次地去解决一件事情,这样做更符合面向对象的思维,而不是面向过程地去处理一件事情。回看我第二单元的最后一次作业,虽然整体上看起来感觉仍然不是很舒服,但是比起第一单元的代码,自我感觉还是提高了很多的。
第三单元——JML与地铁线路图
本单元实际上是一个数据结构+算法的练习单元,涉及到很多图的遍历算法,图的存储结构等等,也是很费脑筋的,但是本单元的架构设计要做好还是很轻松的,有了官方接口的帮助,我们可以很轻松地实现由PathContainer
到Graph
再到RailwaySystem
一些列层次化结构,并实现相应查询方法。本单元个人认为我的面向对象结构设计还是做的比较好的,至少代码感觉有了架构,有了层次。
第四单元——UML的解析
本单元是要实现UML解析器,包括类图,状态图,顺序图以及类图的有效性检查。算是对我一学期OO思维成果的一个展示吧,个人觉得本单元作业我的架构设计已经很成熟了。总之,OO带给了我很大的变化,在今后的学习中,面向对象的思维也是必不可少的,我会不断学习,提升自己,写出更好的OO代码。
对OO测试的理解
整个OO课程11次代码作业,其中前三单元的9次作业我都用自己写的评测机进行黑箱测试来验证正确性。
- 多项式求导的正确性验证:使用xeger库由正则表达式生成随机数据,使用sympy库得出正确答案,并带入值进行验证。
- 电梯正确性验证:使用random库生成随机数据,结果根据电梯运行规则逻辑编写程序进行正确性验证。
- JML单元正确性验证:
- 使用Java的random库进行随机数据生成,使用同学间对拍的方式进行正确性比对。
- 使用JUnit进行精确位置的测试。
说一下个人感悟,黑箱评测虽然简单,但是因为随机数据相似性比较高,所以实际上黑箱评测效率很低,不容易查出bug。比如我在JML第一次作业中,出现了减法溢出的问题,而本地测试中,系统将我的程序优化了,所以没出现这个问题,后来改用JUnit才发现了这个bug。所以,JUnit这个工具很强大,也很方便地去做测试,测试效率也很高。
课程收获
一学期下来,真心觉得OO带给了我很多有价值的东西:
- 我学会了一门新的语言Java,是一种比C更加强大的高级语言,一学期的代码生活,我也见识到了这门语言各种方便之处。
- 我还稍微掌握了一点python,因为写评测机常常用到python的各种库,我体会到了python也是一门很方便的语言。
- 我认识到了做测试的重要性。以前只是依赖OJ系统来进行测试,而现在,我们要自己做充足的测试,保证程序在任何条件下都没有bug,保证逻辑严密。
- 我学会了怎么写工程化的代码,怎么让自己的代码便于维护和拓展,因为OO每单元的作业都是循序渐进,不断拓展功能的,感谢OO培养了我这种思维。
- 最后,我更加认识到团队协作的重要性,在我们写作业的过程中,我们会互相交流思路,互相测试bug,互相讨论新的方法,OO没有团体协作,还是比较困难的,无论是在现在,还是在以后的工作中,一个人的成功和团队协作都是分不开的。
给课程的改进建议
- 将理论课和实验课的时间安排合理一些,避免出现上午讲完下午就考的情况。
- 指导书的说明还要更加明确,绝不能有半点模糊,比如第一单元系数能不能为小数,x是大写还是小写,最后一单元各种概念的理解等等。
- 作业的顺序可以调整一下,例如先进行JML和UML单元,帮同学们掌握规格化代码的写法,以及在官方接口的帮助下把目光放在架构设计上,以及掌握StarUML这一好用的绘图工具。后两单元再进行电梯以及多项式求导,让同学们自己进行输入处理,就很轻松了。