OO第四单元学习总结

一. 架构设计

第一次作业:

   本次作业,我在图(即交互类)中存新建的MyClass和MyInterface这两个实现了MyElement接口的类,再新建几个如MyOperation一样的类,代表操作、属性、参数之类的,方便获取id、name等相关属性。再交互类中按层次,先处理Class和Interface,然后是属性、操作、关系等,最后是依赖于操作的参数,这样处理即使输入没有逻辑顺序也可以将整个图完整地建出来。

第二次作业:

   本次作业比第一次作业增加了顺序图和状态图,和原先类图的关系不大,我便直接在交互类中增加处理顺序图和状态图的部分,新建两个类MyRegion(状态图画布)和MyInteraction(顺序图),在它们内部处理相应的操作即可。我将所有的解析都放在唯一的交互类中,虽然这次作业代码行数没超,但这个类已经变得十分臃肿岌岌可危了。

第三次作业:

   本次作业跟前两次的架构稍微有些不同,新建了三个类MyTheOne, MyTheTwo, MyCheck,分别处理类图查询、顺序状态图查询、本次新加的规则检查,将重担从交互类肩上卸下,只需分别实例化这三个类,任务就分配到它们身上了,避免一个类过分臃肿。在这三个类中各取所需的umlElement,构建自己期望的图,工作时使用即可。


 

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

第一单元:

  第一单元是表达式求导,前两次作业的架构均没有很好地展现面向对象思想,由于求导函数不复杂,所以就直接将求导融入过程中。第三次作业难度上升一个档次,表达式嵌套明确表示不允许我再像之前那么做了,于是第三次作业我使用多态,不同函数建不同的类,重写求导方法、输出方法,这样做我的main终于变得很短很短,结构一目了然。

第二单元:

  第二单元是多线程电梯,三次作业采用的整体架构基本一致,分为调度器类、电梯线程类、输入线程类,稍微的变化是前两次作业的请求都直接进入电梯,即请求一到来有空的电梯就抢,最后一次作业因为电梯有楼层限制,我便将请求队列则放入调度器中,调度器分配到某部电梯的队列中,电梯只在自己规定好的队列中取出请求。

第三单元:

  第三单元是JML,我没有进行自己的架构设计,只是按照规格描述实现相应的方法。

第四单元:

  第四单元如上所述,也是在最后一次作业中改进了原先的设计,将功能分开处理,更加合理。

 

经过四个单元,我也学到了很多oo设计的方法:

  • 第一单元的多态,让我们在一开始就必须要培养面向对象编程的能力,这么做虽然看起来要做许多工作,但真正实现了之后就会感到多态这个方法将整个功能拆解开,层次分明,条理清晰,也不会出现写着写着自己被绕进去的情况。

  • 第二单元的同步方法,让我们避免了出现多线程的死锁或者临界资源共享访问问题,写这单元作业的时候总觉得会出现玄学问题,"这次可以怎么下次运行就错了",类似这种的,其实都是同步没有实现好导致的,真正线程安全的程序应该多次实现结果都一致。

  • 第三单元的规格,作为工程中起到很大作用的一个工具,能够帮助不同的工作者在思维上统一起来,不会产生歧义或不理解,虽然我们学习尚浅,但做好这方面的入门很重要。

  • 第四单元的UML,模型化结构帮助我们捋清层次,通过实现解析器,我对三种UML图都有了从内而外的认识,整体的知识框架在脑海里也渐渐建立起来。


 

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

  • 前两个单元我都是通过手动构造测试,效率很低。第一单元还好一些,第二单元所能测试的情况实在太有限了。

  • 第三单元学习了Junit单元,并运用在后两次作业的测试中,对每个函数的功能可以自己构造情况进行测试。但整体输入的图也由于是手动输入而达不到很高的复杂度,只能测出简单数据。第四单元的情况与第三单元类似,没有进行额外的测试。


 

四. 总结课程收获

  • oo这门课带来最直接的收获就是通过作业和实验学到的知识。四个单元的学习的侧重点各有不同,体现了老师们对课程体系的用心安排。前两个单元从面向对象思想开始培养,经典的电梯作业果然名不虚传,难度和体量都表明了它的重要地位;后面两个单元着力于从另一个角度看待oo,规格化让我们理解其重要性,模型化帮助我们体会如何进行架构设计。

  • 在oo课程中学到的一些思想或方法既可以运用在其他学科中,也富有一定的哲理意味耐人深思。如临界资源要互斥访问,开始一项作业时要从整体架构设计入手而非编程细节等等,这些重要的思维方法对未来我们进行更深层次的学习都是很重要的。

  • 作为一门编程重课,我们一学期写下来了超多的代码,debug能力也在这之中得到了锻炼。如何快速定位错误位置和错误原因,如何最小程度修改代码从而改正,在一遍遍的思考中我们也慢慢找到答案。

  • checkstyle本来给我感觉是一个挺烦人的东西,一行不能太多内容,一个方法还不能超60行,这少个空格多个回车的都不行。随着学习的逐步深入,渐渐养成写代码时候换行等等的习惯,也理解了cs存在的必要性,写出美观易读的代码对编程或者debug都起到潜移默化的作用,代码体量很大时尤甚。


 

五. 课程改进建议

  • 希望实验课结束后能够有一些讲解或者公布至少一部分答案吧,不然很难知道自己写的或理解的到底对不对,实验一结束就抛诸脑后了,收获不是很大。

  • 四个单元几次作业难度递进并不平均(不知道是不是有意为之),有的单元两次作业间跨度太大,有的则比较小,有时也会感觉第一次作业就太难了,花了好久,接下来的两次作业跨度一下子就下来了。

  • 后两个单元为规格化设计和模型化设计,在听课和理解作业的时候确实有这样的意味,但一旦明白作业要干嘛了,感觉就有些脱离主旨,只是在考虑如何实现高效的算法,尤其是第三单元。


 

六. 线上学习体会

  • 线上学习虽然不能跟老师面对面有交流,但通过微信群的方式,反而能够让同学们更加勇敢地表达自己,思维的碰撞增加了!

  • 网课可以反复观看,重复体会老师课堂上讲的某些点,就算只能自己默默理解,但经过这样的反复也能够做到,对我来说这样的机制还不错。

  • oo课程到此就结束了,这真是一门又重却又收获满满的课程,虽然完成作业过程中我都属于速度又慢又艰难那一挂的,但提交和bug修复整个的过程我都能学习到很多东西,每一个错误都能给我带来相应的收获。每次作业和实验都能看到课程组的用心,十分感谢老师和助教!赛高尼high铁鸭子哒!
posted @ 2020-06-17 14:34  Sentor  阅读(160)  评论(0编辑  收藏  举报