一、本单元架构设计
本单元学习了UML模型,整体来说代码实现的难度并不大,但是好的设计却需要花比较多的时间
第一次作业
第一次作业只包含了对UML类图的查询功能,并没有进行什么细致的设计,所有的方法和数据都保存在了一个核心交互类中,显得代码比较臃肿,是一种很差的设计,代码的复杂度也没有进行严格的控制。导致了最终强测有一个测试点超时。
第二次作业
第二次作业加入了UML顺序图和状态图的检查,实现的方法都很简单,实现的方法和第一作业一样,并没有进行设计方面的工作,导致代码极其臃肿,其中核心交互类达到了接近800行,因为checkstyle被扣了50分,血亏。
强测方面由于再一次没有对复杂度进行控制,导致了一个测试点的超时。
第三次作业
如果再像前两次那样写的话代码得超过1000行了,于是这次痛定思痛,将一部分的代码重构。
设计思路是将类图、顺序图、状态图中的查询方法和checkUmlFormat方法分别放在三个类中单独管理,并且建立了MyClass类和MyInterface类,分别将属于这个类或接口的属性,方法,父类,继承的接口等信息保存起来,之后再查找的时候就不必每次再遍历所有的信息,只需要在指定的类或接口的内部遍历或查询即可。
这次作业的新增需求中,check002和check004都得用到深度优先遍历,由于有可能存在重复继承,这样很容易出现的一个问题就是遍历的时候出现循环递归,最终导致栈溢出。我的解决方法是每次在递归的时候传入一个list或者set,来存放那些已经遍历过的节点。在遍历到一个节点的时候先查看是否已经遍历过,若是,则跳过。
二、四个单元中架构设计及OO方法理解的演进
第一单元:多项式求导
我认为第一单元的主要作用在于面向对象思想的入门,已经对编程能力的训练。
经过大一C语言的学习,除去大二的数据结构(编程限于课上的实验,代码量并不大),假期的OO先导预习也只是对java语法的熟悉,已经有很长一段时间没有编写过程序了,这一上来就体会到OO的难度和代码量,着实让像我这样的菜鸡有些吃不消。
架构方面,对类的继承和接口的实现,java的多态有了一定的了解,架构方面不是很出色,原因在于思想还是无法完全理解面向对象,从而脱离不开学习C语言时面向过程的思想。
第二单元:可捎带电梯
虽然从第一单元开始就进入了迭代开发的模式,但是由于第一单元整体的架构设计并不好,导致每一次写作业都是在进行一次重构,对迭代的感受并不强烈。
而第二单元的电梯设计,从单部可捎带电梯到多部可捎带电梯,再到最后的可能需要换乘的多部电梯,每一次都是在前一次的基础上添加新的功能或者限制,来满足新的需求。对可扩展性的要求极高,其中还牵扯到性能的问题。
第三单元:人际关系网络
这一单元需要实现的所有方法课程组几乎都给出了JML规格,实现起来并没有什么难度。还对离散数学中的图论部分的一些经典算法进行了实现,虽然这一单元的强测部分没有设置性能分,但是这一单元的中测跟其他三个单元比起来也是出奇的弱,第一次作业由于轻敌,就出现了写完后没有经过测试就通过了中测,但是强测全炸的情况,让人甚是郁闷。好在后两次作业经过了充分的测试,都安全通过了强测。
第四单元:UML图分析
在第一部分已经作详细的分析,故此处不再赘述。
三、测试理解与实践的演进
测试方面我并没有什么经验,没有写过一次自动化测试程序,在第一、二单元时都是靠自行构造尽可能完整的测试类型和数据进行测试。第三单元由于经历了一次强测的全WA,后两次作业采用了与同学对拍的方法,随机按照格式生成一系列指令进行测试,第四单元则是完全面向讨论群和中测进行debug。
四、课程收获
一学期OO课程下来,收获一定是颇丰,最基础的就是学会了java的单/多线程的编程,还有面向对象思想的理解。经过了四个单元两三千行代码作业的锤炼,coding能力也是得到了极大的提升。还有一个不得不提到就是,OO课程每个单元的总结作业是我第一次写博客,这对不论是写作能力,还是对与技术上的总结,都有了显著的锻炼。通过总结,回顾每个单元的作业,也对每个单元的知识进行了巩固。