oo终极总结

十年热恋 提交于 2020-01-17 05:57:28

OO课程学期总结

第四单元作业总结

第一次作业

作业分析

  第一次作业基于类图的查询,为了更多的尝试,我并没有采用建立图(这在第二次作业中很致命)。将类、接口、方法、属性、参数分别建立类。基本上相当于将类还原出来。但是有些类之间的信息交互做的很差。导致在MyUmlInteraction 类中引入了较多的HashMap,比如类与方法之间。但是我确实也想不出更好的办法了。但是这次在类之间的耦合上下了较大功夫(除开HashMap),MyUmlInteraction 类中调用的方法不会涉及到具体的实现,将具体的实现分发到下面的各个类。感觉自己的第一次设计还算过得去的,但是第二次涉及到类图之外的东西就感觉扩展性差了很多,还得为了bfs彻底新建一个图。

类图

bug分析

  很遗憾第一次作业出现一个bug导致强测挂了,原因是没有考虑到接口的多层继承。其实写之前想到了,但是写的时候人已经写糊涂了,导致没有考虑到。最后一个单元也没有像之前那样和同学对拍。这次的代码太多也没有仔细的静态检查。

第二次作业

作业分析

  第二次作业前几条查询指令其实和第一次相差不大,关键在后三条检查指令。尤其是后两条比较复杂。由于我沿用了第一次的架构设计,为了解决后两条指令不得不新建了一个类来处理图的问题。但我个人感觉这不是最困难的,最困难的在于指导书的迷惑性。在动手写之前我总是先想一想代码该怎么展开,具体到这一次的作业,就是大致想一想每一个指令该怎么实现,会用到哪些数据结构,需要储存哪些信息。但是这一次指导书有很多地方没有说得很明白(个人感觉),导致我一直下不了手,真的很难受。比如说用什么来区分不同的state(考虑到起始状态和终止状态,还有重名的状态(虽然最后限制在没有重名状态))。

类图

bug分析

  这一次没有查出bug

oo四个单元中架构设计与oo方法理解的演进

  传说的oo终于也结束了。经过一个学期的残酷训练,相信自己会有收获。其实感觉如果现在在回头看看自己当初写的代码,当初做的架构,相信收获会更大。

第一单元

  第一单元求导感觉是四个单元里技术难度最高的一次。oo一开始就上这么大的难度确实让人吃不消。连正确性都得不到保证,更不用说架构了。基本上是c语言式的写法,什么地方感觉不对劲就在原地加一点代码。来不及考虑其它的问题。

第二单元

  第二单元多线程其实感觉蛮有意思(当然是从现在的角度出发,oo和os都中都涉及到了多线程)。几个线程一起完成同一个任务,不同线程之间的协调就显得尤其重要。记得这个单元最后一次作业,由于涉及到了好几个线程,最后任务执行完之后程序的安全退出让我想了很久来实现。但是自己的架构其实做得不是很好,同样是不同之间的耦合度太高,后来觉得应该尝试一下单例模式和发布订阅模式。而且这次的作业涉及到性能要求,为了做一定的优化(虽然最后是负优化)也牺牲了一定的架构。  

  不过,这一单元还是让自己对java多线程有了基本的认识,对设计模式也有了简单的了解(虽然基本上没怎么使用)。

第三单元

  第三单元JML规格。根据JML规格实现接口并且补全代码。感觉上和离散数学联系得比较紧,又有点像形式验证。这单元一直在和图打交道,不过我每次都是用Floyd算法+缓存思想直接莽。考虑到查询指令和图修改指令数量的关系,个人感觉用Floyd其实是不错的选择。现在想想,这一单元的架构其实是自己做得最好的一次。可能因为Floyd算法比较直接的缘故。第三次作业的几个求加权图的最短路径,在对图做好信息处理之后,就可以直接用第二次的算法来求解。而且三个最短路径在实质上其实是一样的。因此事情变得简单起来。而且这一单元也是我唯一一次没有被找出bug。一个好的架构不仅扩展性强,而且思路清晰。

第四单元

  第四单元由于之前有详细解释,就不多说了。

oo四个单元中测试理解与实践的演进

  oo测试真的是很重要的一个环节。

  oo刚开始的时候,第一单元,我基本上都是写完之后花一个晚上的时间来检查自己的思路,静态的检查代码。当然了,基本上每一行代码都会检查到。这样可以检查出一些bug,但是并不是100%。导致我第一单元出现一些比较低级的错误。静态检查并不能保证自己能把每一种可能都考虑到。这也不现实。到了第二单元,我就吸取了第一单元的教训,开始用测试数据来检查自己的代码。因为没有标准的输出,我都是用同学程序的输出来和我的作比较。但是由于数据都是随机的,效果也不是很理想的。一些bug很难用随机的数据检查出来。这个时候,一方面需要自己人为的构造一些比较特殊数据,还需要自己静态的检查自己的代码。尽量不出现低级的错误。到了第三单元,基本上就是静态检查+随机数据对拍。效果还过得去。但是到了第四单元,感觉自己好像有点疲倦了,在尝试将java代码转换成UML类图失败之后,就就没有大量的随机对拍了。静态检查也做得不多,导致第四单元强测崩了。

课程总结

  转眼到了和oo说再见的时候。

  虽然个人感觉oo课还有很多可以改进的地方,也有让人感觉体验很差的地方。

  好了,不出意外还是有但是的。

  有段时间觉得oo课这样每个单元接触基本上完全不同的内容,导致最后我们什么都没学好。现在想想,就算一个学期就光学java多线程也不见得学的比较透彻。个人觉得,oo课能让我们接触到很多不一样的东西,JML、UML、Junit等等,或许了解的程度都很低,但是大家都上大学了,剩下的东西是不是该靠自己去钻研学习了?

  而且,每一次的作业不仅要求我们考虑面向对象,对我们的代码能力也有要求。这一学期下来,感觉自己的代码能力也有一定的提升。在测试的时候,当自己尝试去搭建简易的评测机时,涉及到shell编程、java proc的知识都需要自己上网查相关资料,算是锻炼了自己的自学能力,这些也算oo课程的周边吧。

  还有就是初步了解了starUML、jprofiler的使用。

  

改进建议.  

  1. 指导书是不是可以再清晰一点呢。个人感觉关键的是给出具体的定义,比如说最后一次代码作业的state定义,什么才是一个state呢?考虑id?name?type?
  2. 作业难度。有时候感觉作业难度有点大,连作业的准确度都很难都得保证,更别说考虑整体的架构了。或许可以延长时间或者给出多一点的提示。
  3. 优秀代码分享。四个单元中我只认真读了第三单元最后一个作业的标程,很多时候想看看标准程序,但是好像一直没有,可能助教和老师有自己的考虑。但我觉得看看优秀的代码确实很有帮助。

  最后,感谢老师和助教一个学期的辛苦付出。在我个人看来,oo虽然没有os让我更感兴趣。但是收获也是满满的,尤其是oo课程还在一个探索的阶段的情况下。也祝愿oo能早日成为一门成熟完整的课程。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!