我认为第四单元的难点在于对UML结构的理解,理解了类图,顺序图,状态图这三种图的结构之后,第四单元可以说是最简单的一个单元了,在算法和构筑复杂程度上均是各单元最低。在UML结构的理解上,除了要认真观看课程外,最重要的还是用一用StartUml,自己创建类图,顺序图,状态图,用清楚每一种图,这样就能透彻地理解各种结构了,当然也可以翻看学习讨论区中他人的理解,也很有帮助。
一、第四单元作业架构分析
对于本单元作业,在一开始我就想好了将每一个UmlElement转化为TreeNode,将图中elemet的父子关系转化为TreeNode的父子关系,构成一个方便查找的树。当需要实现新的功能时,查询所构筑的树即可。对于初始化树的过程,(即处理初始给出的UmlElenment原数组的数据转化为各个Map以及TreeNode结构)以及MyUmlInteraction中的成员问题。在最初我实现初始化时,我省事只遍历一次原数组来构建。这种方式的问题在于,当建立父子关系时,可能父已经在图中了而子还不在,(也可能子已经在图中了而父不在),只能在检测到另一方还未添加时,遍历Element数组将其找到并添加。之后采用了遍历两次的初始化方式后,实现得比较顺利。再谈MyUmlInteraction中的成员问题,首先考虑到接口要求输入name查询,所以一定要有一个通过name查询对应id的Map,其中的id由于可能有多个,故采用List作为Map的value部分。另外由于很多方法都于class相关,因此需要一个通过id查询class的Map,剩下的就是由id查询treeNode的Map,这个是必须的,它将原本的Uml结构与TreeNode结构链接了起来。
实现了TreeNode的架构后,对于方法的实现就变成了对于树结构的遍历过程,除了第三次作业中有个别方法需要用到比较难的算法,其他方法都能非常轻松地实现,架构如下:
第一次作业
第二次作业
第三次作业
第一次作业由于一个笔误强测错了2个点只拿了90分,第二次第三次拿到满分。
二 、四个单元架构设计和OO理解演进
做完了OO的四个单元,先分析下每个单元设置的目的。
第一个单元主要目的是让同学们熟悉面向对象的思想,熟悉Java的语法,数据结构。
第二个单元主要目的是让同学们掌握多线程编程。
第三个单元主要目的是让同学们掌握JML语言。
第四个单元主要目的是让同学们掌握Uml结构。
对于第一个单元处理多项式求导的问题,这一单元我的构筑从面向过程变得越来越面向对象了(经历了三次惨痛的重构),一开始面向对象只是个幌子,实际上是面向的过程,后来到了第三次作业,确实得实现了面向对象的思想,将每一个元素的职责精细地规划分类。这一单元也通过重构的痛苦让我明白了设计的重大意义,最初的那三个星期可以说是最艰难的三个星期,每周都花了绝大部分时间在OO上。
第二单元的多线程对我来说也颇具难度,多线程编程我之前从来没有接触过,理解概念上就碰到了不少难题,不过好在最终也一一克服成功理解。这一单元我由于设计得认真用心,没有重构,也是比较成功满意的一个单元,性能分都在99分左右。构筑的新颖度上也比较满意,采用的是自己构思的构筑,不同于很多同学的让电梯自行判断上下人以及运行规划,改为将电梯分组,通过总的中央调度器来统筹规划。
第三单元的JML语言让我认识到了算法的重要性,也明白了我之前对于算法实在不够重视,对于性能的要求使得我必须采用tarjan等从来没有学习过的算法,在构筑上,这一单元我的构筑平平无奇,与大多数人差不多,没有什么称道之处。
第四单元加深了我对面向对象语言的理解,UML结构非常有趣,这一单元在具体实现上比较轻松,构筑比较简单,前文已述,不再赘述。
三、四个单元中测试理解与实践的演进
第一个单元时我对测试的理解局限在自己跑跑测试样例,想几个特殊情况,再问同学要几个边界情况试试bug,然后交上去看过了没有,过了就皆大欢喜,没过只能再慢慢找bug。
第二单元我开始接触自动化测试,虽然数据没有什么针对性,最终也没有测出什么bug,但还是起了个不错的头。
第三和第四单元中自动化测试帮了我大忙,自动生成的数据对于第三单元和第四单元的debug非常有用,我找出了不少bug。
四、课程收获
1.理解了算法的重要程度,没有算法笔都动不了,这一点在第一单元第三次和第三单元第三次尤其让我映像深刻。
2. 理解了设计的重要性,第一单元的三次重构:多么痛的领悟!
3.锻炼了Java语言
4.锻炼了设计能力,重构次数越来越少。
5.锻炼了心态,每次公布测试都是一次渡劫!
五、三个具体改进建议
1.第一单元第三次可以考虑稍微简单点,对于之前没有接触过Java的同学来说实在有点困难,为了拿到性能分当时花了整整三天琢磨研究,别的网课只能放到周末补上,所幸功夫不负有心人,拿了99+的强测分。
2.JML这一单元的工具不好用,那一单元博客中要求用各种工具测试,但说实话那些工具真的不好用,效果不好。
3.一个单元中每一次作业的梯度有待调整,例如有的梯度太小,有的梯度太大,举例:第一单元中第二次到第三次作业梯度太大,第二单元中第一次作业到第二次作业梯度太小,第三单元第一次作业到第二次作业梯度太小。
六、网课OO体会
1.OO的理论课本身有点偏理论,在家上网课属实有点听不太进去,容易走神(我的坏毛病)。
2.实验非常刺激,助教说简单都是骗人的,千万不要信!每一次实验都是一次计组上机!
3.作业给平淡无聊的疫情家里蹲生活添加了不少刺激和乐趣!
4.非常感谢助教,助教非常认真负责,在上过的课中绝对能排进前三。