微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OO第四单元总结

OO奇幻冒险终章

①本单元作业架构

本单元需要在课程组提供的接口基础上实现一个UML类图、顺序图和状态图分析器。课程组接口实现UML图到UML基础元素UmlElement的分解,我们任务的重点就是对UmlElement进行分类,建立关系将整个分拆的UML图用数据结构组织起来,方便后续的查询和计算和可能的需求扩展。

我的第一次作业将UML类UmlClass和类下的方法、属性组织在一起作为自定义类MyUmlClass,代码规模和UML类图如下:

代码规模

因为第一次作业相对简单所以没有出现的单个文件超过500行的问题,在后两次作业中我才用的解决行数过多的方法是按照解析功能分类将一个文件中具有共同查询特点的方法抽取到新的一个类中。

UML类图

在选择容器时,我只使用了ListMap,体会到了这两种容器管理数据的便捷。当一个容器管理的一类数据需要频繁查询时,Map优先,当需要使用一个类似C语言中数组的容器来存储我们并不需要遍历的一组元素时,List是一个不错的选择。(这里不用int []a = new int[xxxxx]的原因很简单,避免在Pre中就提过的重复造轮子)

尽管第一次作业较为简单,这次作业的架构设计还是有缺陷,比如MyUmlClass对数据的管理不到位,在类的继承查询和接口实现查询时,MyUmlClass并不能够提供对应类的全部有效信息,迫使方法只能遍历所有继承关系或实现关系一一比对id字段进行后续处理,导致代码存在极大冗余和复杂度,虽然本单元作业没有将重点放在性能上,但是从软件设计角度来看,没有管理到位的数据带来的繁琐是不可以接受的。

第三次作业中,我在前两次作业基础上重构了代码,以状态图为例,每个MyUmlState管理一个MyUmlTransitionHashMap,每个MyUmlTransition管理一个 UmlEventHashMap。这样设计可以自上而下简化查询,这样的结构像套娃一样。

套娃

②四个单元架构设计中的OO方法

回顾四个单元,表达式求导、电梯调度、JML规格化、UML类图解析,都不是一帆风顺。

第一单元——表达式

表达式求导,考察对于表达式本身以及运算的抽象,而抽象思想也是面向对象关乎全局的重点。表达式中有式子、项和因子,运算中有加减乘和求导,最后还需要考虑合并同类项等优化问题。在这一单元中,通过听取其他同学的分享,我学习到了他人对问题的抽象方法,也体会到了好的架构会让你的代码在迭代式开发中成为你的盟友而非敌人。

第二单元——电梯调度

电梯是生活中常见的实体,这一点使得本单元对抽象能力的考察相比上一单元大大降低。

我认为电梯调度主要考察多线程编程和调度器模式,在多线程编程中,我们需要注意使用同步和互斥避免共享带来的线程安全问题。在多部电梯共同处理多任务状态下,一个调度器可以让电梯角度只关注如何运送乘客完成任务,乘客请求输入角度只关注输入而不考虑请求会去往何处,合理的任务划分会更有利于代码功能划分和未来迭代开发。

第三单元——JML规格化

JML这一单元重点在读JML规格,而从规格到Java代码的转换反倒更轻松些。

第四单元——UML类图解析

第一次作业的可扩展性很差,可能就是封装没有做好,这一点和第一单元又出奇地相似惊!!我陷入了死循环!!

③测试理解和实践演进

测试有多重要???

其实,是

0

还是

100

可能只是一念之差

Dijkstra说:“程序测试只能表明错误的存在,而不能表明错误不存在。”

对于一个程序,测试应该不只是一种检测工具,还是一种证明工具,通过测试意味着程序具有的可靠性取决于测试的覆盖性

我一路采用的都是python程序随机生成测试样例,多份代码一起对拍找bug的测试方法,但由于生成数据强度不足、题面理解偏差等原因导致强测惨不忍睹

④课程收获

一学期的面向对象课结束了,虽然还是没有对象,但收获还是满满的

  • 非常重要的一点,我知道了从孤军奋战中跳出来,向别人请教学习,同学们互相学习,在学习OO中也会事半功倍
  • 行百里者半九十,OO每周的单元作业具有相当的挑战性,无数次踏过图书馆西侧的砖石路面,感受到后背传来笔记本的热量,头顶是北京独特的晴朗星空,随着人流漫无目的地飘回宿舍,心头还压着一块重重的石头,不放弃,是我最后的倔强
  • 不要重复造轮子,这是助教团队给我印象最深的一句话。
  • 拒绝南辕北辙!在实现功能时,找对方法很重要。”科学管理之父“泰勒说:“管理就是确切地知道你要别人干什么,并使他用最好的方法去干。”用在自身这里就是“我们既要学会做,还要学会怎么找到最好的方式去做。”

⑤课程改进建议

最后想说,这一个学期的课程体验还是挺nice的

提出供课程组参考的建议如下:

  • 每次作业课程组是否能够提供一些优秀同学的范例供全体同学学习(如果涉及到抄袭问题也可以公开代码段或者每个单元一次),毕竟每次都认真看代码学习的同学寥寥无几,且这种慢功夫效果因人而异
  • 希望分享课形式可以更加多样,比如分小组研讨单元问题,小组上台发言,增加同学参与度,也方便更多同学多拿点平时分......哭泣
  • 和第一条比较类似,希望可以让更多同学了解什么是优秀的测试,不知道能否在强测开始后向大家发布一些关于测试的资料或者优秀示范

最后的最后,希望我们的OO课越开越好,让更多的同学从中受益!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐