ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OO第四单元总结

2021-06-26 16:03:06  阅读:158  来源: 互联网

标签:OO 样例 作业 单元 UML 父类 第四 指导书


第四单元作业的架构设计

第一次作业

本单元第一次作业需要完成的任务为实现一个UML类图分析器UmlInteraction。为了方便存储和查询,我建立了自己的MyUmlClass,MyOperation,MyInterface

image-20210626130006829

MyUmlClass:除自身id,name等外,存储了本类Attribute,Operation,AssociationEnd,父类及实现的接口;
MyOperation:除自身id,name等外,存储了本方法的parameter

由于输入的无序,我的做法是先将输入的umlElements遍历,分类存放在不同容器中。然后依次完善MyOperationMyUmlClass中的信息。

因为涉及到大量查找,绝大部分的容器使用的是HashMap,即根据id找element,但由于有相当多以name为索引的查找方法,在存储时,除id到element的HashMap外,我增加了name到element的HashMap,提高查找效率。

值得注意的一点是,关于继承和接口的处理我发现我的思路与周围的(几个)同学大相径庭。当涉及到继承问题时,周围我已知的几个同学都是从需要查询的类开始往上搜它的父类,然后找到后输出或存起来避免下次重复这一过程。这应该是非常自然的想法,但我采取了似乎有点反常识的做法:一次性在子类中存储它可能用到的本类、父类的所有属性。具体做法是:首先根据输入的继承关系在类中存入它的所有孩子,然后从最顶级的父类开始,将它的Attribute,Operation等加到它的所有孩子中,这样处理后每个类保证已经拥有了它的所有父类的信息。查询的时候不用在一层层向上查询,而是直接读取。
这种处理办法对我来说用起来非常方便,有种一劳永逸的舒适感。但很明显也有不合理的地方:每个类都需要存储大量信息,整体上看很多信息是被重复存储的。

第一次作业上手时并不容易,也花了很多时间试图弄懂官方包的代码,最后写了800行左右的代码,然后发现室友300行就搞定了(不看不知道差别如此之大)。最后强测时因为一个非常显而易见但我没发现的错误出了几个bug。

第二次作业

第二次作业是增加对UML顺序图和UML状态图的解析,是这三次中最简单的,代码量也很少,可以说是很轻松愉快的写完了,强测也没出bug。与第一次相比增加了StateManagerCollaborationManager分别处理状态图和顺序图。

第三次作业

第三次是有效性检查。在第二次基础上增加了Check类做有效性检查。这次作业遇到的最大困难是对指导书的理解和特殊情况的考虑。例如困扰众人的R001

image-20210626134801459

以及重复继承中的各种情况。由于写博客时我还未开始本次bug修复,所以理解上的问题以及考虑不全面应该不只以上这两点。

有效性检查中比较困难的几点是判断循环继承,重复继承,重复实现接口,我均采用bfs进行搜索。

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

第一单元表达式求导开始时,我的pre还有部分没做完,对Java的语法了解都还很欠缺。虽然老师从一开始就强调“面向对象”的思想,但是从还在“Java入门的网课”到理解老师所说的思想还是挺困难的。第二三次作业难度增加时才不得不舍弃第一次粗糙的设计,考虑可扩展性和层次化设计,对因子,项,表达式进行管理,多少开始有了点面向对象的思想。

第二单元多线程电梯,主要学习了生产者-消费者模式。对我来说这是难度最大的一个单元,但也收获最大。相比第一单元对类的划分已经比较自然:电梯,输入,调度器,等待队列等。如何实现多线程资源共享以及如何避免死锁问题是在每次周六晚至周日凌晨过不了中测中痛苦领悟的,总是在周日被同学指着代码痛骂才知道自己的死锁问题。做完第二单元,对线程安全加深了认识。

第三单元JML,这一单元最为轻松,只要按照规格写就行(甚至无需知道要干什么),虽然我完全得并不是很好。主要问题在其中涉及的算法,也算是重学了一边图吧。写完看自己前两个单元的代码,显得臃肿和含义不明,这一问题在第四单元中自认为有了些长进。

第四单元UML,没有老师所说如此简单,但较之一二单元容易一些。在经历前三个单元的磨练后,第四单元设计时开始注意架构是否合理已经可扩展性,至少没有经历重构也算是一种进步吧。

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

四个单元中我都没有自己设计评测机,基本只是根据指导书完成后用课程网站的样例测试,外加以自己手动构造的样例和同学友好分享的样例。也想过学习写评测机,但是实际总是在ddl前苦于中测,再加上时间的紧迫以及不知从何下手。

在第三单元中了解了Junit测试,但是似乎对于作业来说不是很好用,遂丢弃。

课堂中老师讲到构造样例时等价类划分,构造正常、异常、边界数据等思想。但可能因为手动构造样例太少,我对自己代码的测试还是非常不充分。

总之一学期结束了还是没有学写评测机比较遗憾,数据测试方面也少有进步。一方面是懒惰的心理作祟,对课程组评测机的依赖,另一方面是本身掌握知识少,时间紧迫,苦于使作业有效的挣扎。

课程收获

这学期的OO学习绝大部分都是感到无力,极少数时候能有成就感。从Pre开始每一次作业都让我感到自身知识的匮乏与欠缺。上课时老师讲的抽象的设计思想实际应用起来困难,课下完成作业时有时候问题不是不懂而是根本不知道用什么问什么查什么。

最大的变化是这学期从饮食作息极其规律变成了足不出户无心饮食沉迷熬夜,当然原因还是因为自己能力的欠缺,不得不在花费时间上进行弥补。同时也感到课程组提供帮助的不足,原本编程能力就不足的同学很难获取足够帮助,甚至越掉越远。

虽然过程万分痛苦,但是这门课确实让我学到了很多。首先至少学习了一门语言,虽然课程组老师说掌握一门语言不是什么事,但对我来说已经是很重要的收获了。然后就是设计架构的重要性,经历了多次的痛苦重构,至少以后在写代码时会想得更多更远一些,而不是不管不顾直接上手写。另外也了解了生产者-消费者,工厂模式,单例模式等,对多线程有了一定认识(并心生畏惧),了解了尽管还不成熟的JML语言和UML模型。

尽管大部分时候是感到绝望的,但也有在凌晨过了中测的欣喜以及十六次作业都完成并有效的成就感,至少在进步了。

改进建议

  • 难度跨度大

    第一单元表达式求导和第二单元多线程电梯的前两次作业难度都跨越较大,尤其是第一单元,明显感觉大家的焦虑和绝望。另外,从往年学长学姐所写来看,作业的难度提升了不少,现在的难度已经足够令人绝望了,再加大难度真的不知道怎么应对。

  • 时间安排紧凑

    第一单元的互测刚开始还是比较有参与感的,但是之后发现每周要写新的作业,要修bug,其它课程也需要花费时间学习,所以权衡之下将互测的时间留给了其它。感觉越往后互测参与人次越来越少,作用越来越微弱。另外周三晚上开始新作业或许可以考虑提前?上午开放白天写,晚上开放当天开始则必然要熬夜写了。

  • 指导书

    每个单元迭代开发时指导书会更新,但是更新的部分没有突出显示。例如第三单元JML的第二次或第三次作业增加了红包消息和表情消息,已经填写过的某个方法需要修改,但是因为一般不会修改已写方法所以忽略了,为此多花费了许多时间。

    第四单元UML指导书能更详细就好了。

标签:OO,样例,作业,单元,UML,父类,第四,指导书
来源: https://www.cnblogs.com/buaacjx/p/14934457.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有