一.架构设计
1.第一次作业
首先做的就是把所有的Element全部存起来,我把UmlClass和UmlInterface重新用两个新的类来记录了一下,用于更快地找到他们的关联。其实总体思路还是比较简单的,但是在某些不经意的地方还是会有一些小bug。另外,这一单元的数据纷繁复杂,可能会有很多想不到的情况,比如之前就根本没考虑过自关联,又是这样那样的各种花里胡哨的诡异数据。提交第一遍的时候着实吃了不少亏。
2.第二次作业
到了第二次作业,经过了第一次的基础,自己想的东西也多了起来,首先是建立一个新的类,继承了第一次作业的Last,为了简化代码量,将Last类变成抽象类,
一次继承之后,加入了状态图的所有操作,期间也考虑了重名、自环、多环、终止起始等状态的各种可能出现的问题。
接下来是顺序图,和之前的继承相同的操作,顺序图其实也很好统计,就是单纯的数数而已。
同样的,为了减少代码量,变成抽象类,在检查002,008,009时使用可实例化的class
在check002时,一种较为简单的方法是,遍历寻找每个Association的end和另一个end所对应的class中的attribute,查看是否重名。
在check008时,我是使用删除入度或出度为零的点,这样一次次重复删除下去,剩下的就一定是个环了。
而check009基本上和008相同,只需要再附加查找一次看看父类(或接口)是否在环上即可。而另一种更加方便编程的方式就是无脑DFS,对每个节点都遍历一遍,当父节点又出现一次时显然就GG了。
总之这两次作业并不是很难,但最大的问题是,需求模糊不清难以把握。很多要求都是在代码写完了之后突然说有更改,或者本以为不需要考虑这方面的内容,突然又加上了限制条件。可能这就是当代程序员的现状吧。↓
二、总结四个单元的设计架构
个人感觉除了第一单元把代码重构了之外,后续的几个单元设计架构还是比较容易扩展的。
电梯单元整体上第一次和第二次就是改了个楼层,第三次也只是稍微加了一些调度。
JML和UML其实架构设计体现的更加明显,毕竟方法都已经给好了,要说重构的话也只能是说修改了数据存储的类型,从链表到映射二维数组,大的框架结构并没有发生变化。个人感觉这可以算是OO课下来最大的收获之一了。毕竟没人愿意每一次作业都重构。
三、测试方法的演进
第一二单元时,我是采用最简单但最出力不讨好的测试方法,手动构造数据测试,而到了第三四单元,我开始构建自己的数据生成器,进行大规模的测试,同时偶尔利用Junit进行测试。后期除了完整的数据生成器,还编写了输出的比较器,能很好地找到输出的不同以及相关的输入,更精准的定位到bug。
四、课程收获
1.第一个收获肯定就是Java相关知识了。
之前从来没有使用过正则表达式,OO第一单元就让我掌握了正则表达式的使用;第二单元让我接触了神奇的多线程;第三单元JML的相关知识、Junit自动化测试;第四单元UML的使用……
2.更快的写巨多代码。
从第一次作业到第十四次作业,每周一次的作业让我有了更多编程经验,也有了完成大规模编程的体验。
3.不断优化的思想。
之前的c语言课程、数据结构课程我根本没考虑过CPU时间或者是实际运行时间的优化,我在意的是怎么把我的代码写得更简短。而经过了OO的练习,我才发现,不同的程序对性能的评价是不同的,比如电梯,要是想要精简代码,其实只需要很少的代码量就能完成,但是电梯强调的是响应时间(作业中是最后送达时间)。因此,对于不同的要求,还是要用不同的思路和算法去实现,不能单纯的图程序员的简单。
4.耐心。
之前网上流传着这么一句话:一杯茶、一袋烟、一个bug改一天。简直深有体会,关于各种稀奇古怪的数据,不为人知的weak5和middle5总是能够卡住一群人,这时候就需要耐心去完成了。经过这么多次作业,我觉得在这方面我还是有很多提升的。
5.居安思危。
尽管过了中测,但可能还是会有bug;尽管CPU时间没炸,但强测很可能还是会TLE,总之,这么多次OO下来,我已经开始了解到程序安全性的重要。某些你想不到的输入可能就真的会出现在你的程序输入中。因此要不断的找自己的bug,居安思危。
五、几个建议
1.每次做作业都会觉得指导书不够明确,在某些地方会有很多情况需要考虑,但指导书根本不够详细,或者甚至在讨论区、在水群里对作业进行解释,令人头秃。
2.上午刚讲完某些知识,下午实验课就要考,还要现下载相关的软件,非常不友好。尽管有的时候可能助教是在水群里通知过了,但转眼间99+的消息,根本就不能保证每个人都通知的到。