OO第四单元博客
第四单元博客
这个单元的作业,emmmm助教们做的工作还是一如既往的多,我们只负责添一添代码,最后一次作业了,感谢各位助教和老师,同时也希望我能顺利通过这最后一关。
架构设计
第一次作业架构展示
第一次作业需要实现10个命令,需要熟悉staruml的文件格式,同时还需要区分类与接口,理解继承与实现的不同。
本次作业的实现用了5个类:
- MyUml类,用于实现类和接口的相同行为
- MyUmlClass类,用于实现类相关命令,是MyUml的子类
- MyUmlInterface类,用于实现接口相关的命令,也是MyUml的子类
- MyUmlOperation类,用于实现类中操作相关的命令
- 最后就是需要实现的MyUmlGeneralInteraction类
第一次作业实现分析
这次作业的命令实现起来都不困难,主要还是对命令的含义理解透彻以及把可能的情况考虑全,容易出现错误的地方有:
- 没有考虑到接口可以多继承。接口与类不同,接口可以多继承而一个类的父类只有一个
- 关联端的id和reference要区分清楚,reference才是表示这个端所代指的类或接口
- 在Generalization元素出现时,其中包含的父类的元素可能还没有出现, 所以需要注意读取元素时先读取类和接口的定义,然后再读取其他元素保证id总是可以索引到正确的类或接口
- 在进行宽度优先搜索时,注意标志位清空o(╥﹏╥)o...
在实现时,Map数据结构起到了很大的帮助,所以要善用这个数据结构实现id到类和接口的快速索引。
第二次作业架构展示
与第一次作业相比,第二次作业的难度就大大降低了,这少不了助教团队和老师对大家的仁慈...这里再一次感谢助教和老师们。
第二次作业相比第一次作业增加了四个类。
- MyUmlInteraction,记录interaction的相关信息
- MyUmlLife,记录lifeline的信息
- MyUmlMachine,记录状态机的信息
- MyUmlState,记录状态的信息
因为第二次作业在助教团队的宽宏大量下难度大大降低,所以对于状态图和顺序图的命令的实现,这里不再赘述,重点讲一讲三个规则检查的实现。
- 规则1:类的属性中不能有重名,类的属性和类的对端名称也不能重
- 这个相比其他两个规则很好实现,只需要使用set记录即可
- 规则2:不能循环继承
- 这里一开始理解出错了,把实现也加了进来,在讨论区看到老师的回答才改过来,所以要区分号实现和继承这两个不同的关系。而环的检测算法就很简单了,深搜后发现有回向边即可。
- 规则3:不能重复继承
- 这里和规则2不一样,这里需要考虑类对接口的实现。而重复继承的检测算法只能适用深搜,在回溯时检查有没有重复继承,不知道有没有更好的办法。
OO理解方法演进
经过这四次作业, 对于OO的理解越来越深:
- 第一次作业因为对java语言的掌握还不够熟练所以没有顾上管OO...只想着把功能实现对了就好,而且当时时间也很仓促没有好好写代码,只有在之后几次作业中,才在慢慢的重构中逐渐理解OO
- 到了第二单元,需要实现多线程,还好之前的经验让我对多线程掌握了一点皮毛,可是这个单元在使用多线程时还是漏洞百出,比如锁的错误使用和信号量的错误使用,但是经过不断的重构,也慢慢的体会到了面向对象的一点皮毛
- 在第三单元写JML时,我理解了为什么程序要先确定好规格再动手写代码,理解了设计比实现更重要这个道理。
测试理解与实践的演进
- 一开始只会用IDE自带的console进行交互测试,在测试时也只是自己拍脑袋想测试样例,覆盖度和完备性完全不足
- 然后学会了使用JUNIT,真的好用
课程收获与感悟
- 相对于助教和老师们的工作,我们做的真的很少了
- 对java语言掌握更熟练,对多线程掌握更熟练
- 学会了软件测试的方法
- 对设计模式有了一定的了解
- 对UML的类图,状态图和顺序图有了更深的理解
课程建议
- 怎么说呢,自然语言不像机器语言,表达的准确性还不够,指导书上一些规定的叙述还不够完善。不过已经很好了。
- 给我们的工作量再少一些,主要是感觉助教们做的工作好多,把格式检查这些都做了。
- 可惜目前还没有一个准确的量化的判别标准用于判断代码是否符合面向对象的特性和风格,所以在互测时或许可以在准确性的基础上,增加对代码是否足够OO的检查
最后再一次感谢老师,感谢助教团队。