OO_第四单元总结&课程总结

OO_第四单元总结&课程总结

本单元架构设计

第一次作业

这三次作业其目的是让我们以面向对象的方法管理UML图中的各个元素。

第一次作业中,由于只有类图相关的元素和方法,所以我将实现接口方法所用的UMLElement都放在了MyUmlInteraction中,由于元素具有层次化属性,所以创建了MyClassMyInterfaceMyOperation来管理元素。其中MyClass引用了其他两个类,而这三个类在MyUmlInteraction都有相应的引用。所用容器基本都是HashMap。形式基本都是id2Element

第二次作业

第二次作业加入了顺序图和状态图相关功能的实现。我也根据题意实现了MyInteractionMyStateMachineMyTransition……来管理元素。大体思路与第一次作业一致,是相对比较简单的一次作业。

按照面向对象的的原则,应该将三种不同类图对应的元素和方法进行封装,分成三种不同的类。但我确实没有意识到这样做的好处,只是发现如果将接口实现在一起就会超过500行。于是我把第一次作业实现的内容作为一个抽象类,让MyUmlGeneralInteraciton继承这个抽象类,在其中实现其它两种图的内容。确实不符合面向对象的原则,也无法满足第三次作业的需求。

第三次作业

第三次作业我将内容封装成了ClassDiagramStateDiagramSequenceDiagram三个类,分别实现了检查正确性的方法,并由MyUmlGeneralInteraction调用

这次时间复杂度要求并不高,重点还是要理解清楚题意和错误的具体形式。

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

现在回顾来看,我这学期的OO学习其实是呈现前紧后松的状态,在Pre和前两个单元学到了大量的知识,也提升了对于面向对象的理解,极大的提升了代码能力。但是后两单元学习到的更多是知识性的东西,代码方面依旧是按照前两单元积累的经验编写,面向对象思想似乎没有很大的提升。

Pre

不得不提一下预习作业所起的作用。其实预习作业对我来说也是非常折磨的,但也是预习作业让我真正开始学习java,初窥面向对象,知道了什么是封装、继承和多态。使得第一次作业不至于无从下手。在以后的OO学习中,我也经常拿图书管理系统来类比思考面向对象的一些问题。

第一单元

确实是最难但是收获也最多的一个单元。仍记得看到第一次作业指导书时我的震撼,理解了一晚上也没什么思路,重点跑到正则表达式上去了,后来才在与同学的讨论和实验中探索出了思路。在这单元中,需要把不同类型、层次的表达式实现的功能进行封装,一层一层调用求导,最终得到答案。

这一单元主要运用的思想是封装,随着三次作业的进程,我把每类式子封装的越来越好,每个类的代码量逐渐均衡,代码的可扩展性也越来越好,更是领悟了java语言和面向对象方法的好处。

第二单元

第二单元是多线程,这也是我第一次接触的全新概念,更多的是学习了多线程的知识和java的多线程编程方法,在性能优化过程中对分配和扫面算法有了较为深入的了解。

在面向对象方面,我学习应用了生产者-消费者模式,来为电梯分配乘客。应用了继承和多态,来实现三种不同模式的电梯,以及三种模式下分配乘客的分配策略。由于第一单元对于封装的应用,我的电梯类比较独立和完善,在三次作业种基本没有大的改动。

第三单元

第三单元是关于JML规格的理解。这一单元让我初次接触了JML,学习了其基本语法。也学习了并查集算法,对优化的搜索算法等。

在面向对象方面,我首先感受到的是面向对象中,每个类和方法是非常独立的,只要保证每个方法,每个类的正确性,那么整个工程也会是正确的,这也正是JML要做的事情。此外这一单元也相当于JML引导着我们完成了一个简单的、规范的社交网络,在完成的过程中,如果认真思考方法、类的逻辑,对于之前两个单元面向对象理解不充分的地方是个很好的补充。

第四单元

第四单元我们终于接触到了其它学校OO课程可能最先讲的内容,UML。课程对于UML的切入点还是独特的,仍然是用作业倒逼我们理解UML图中的元素,关系,在实现函数的时候,我们不得不搞清楚UML图中哪种元素是干什么的,在阅读官方包时也能又比较好的理解。缺点就是对于知识性的掌握不会很到位,比如我现在仍然不是很能说清楚依赖、关联、组合和聚合之间的区别。

这一单元相当于时用面向对象思维来学习面向对象的工具,在实现时还是封装好每一个类,然后实现其层次关系和调用关系,可以说时从理论上补充解释了我们前三个单元的面向对象到底学了什么,让我们对面向对象有了更规范的理解。

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

总体来说在OO课程中,由于我能力有限加上自我懈怠,我做的测试工作相对比较少,收获比较少,也是很遗憾的。

  • 在第一单元我根据讨论区的提示,用python写了个表达式自动生成器,以及验证器。但是没有把二者连起来,只* 能手动把生成的数据和我程序的运行结果拷贝到一个文档下,作为验证程序的输入。不过这个简陋的验证过程还是测试出来我的一些bug。在互测中也有一定的作用。

  • 第二单元中,我确实没有办法实现在不同的时间点进行输入测试数据,只好生成一些测试数据,然后一起黏贴到控制台中,然后在写一个程序统计乘客是否进来又出去了来验证正确性。这样的测试虽然不全面,但是似乎对于正确性和运输效率测试还是挺有效的。

  • 第三单元中,虽然我了解并尝试使用了JUnit来检验正确性,但却并没有大范围的使用,我主要是通过阅读代码并对比JML,来确保我代码的正确性,也就是所谓的“静态检查”。

  • 第四单元,我测试思路主要是用StarUML来更改课程组给出的一些样例,再用官方包转化为输入形式来测试的,也借用了大佬分享出来的一些样例,测试相对不充分。

课程收获

这门课带给我的收获自然还是很多的,虽然OO很费时间,很折磨人,但所做的工作都是有效的,能让我学到东西的。

  • 最大的收获自然是熟悉了java语言,拥有了面向对象的思维,开始用面向对象的方式分析和解决问题,这些在前面也都有所讲述。

  • 其次,锻炼了我在面对一个比较困难,繁杂的项目时的心态。在每周三晚上阅读并分析指导书的过程中,我也慢慢的适应了在做每一次作业(尤其是单元第一次作业)时,从茫然到一点点学习,思考,并找到思路,最终实现的过程。我想以后在工作中遇到的问题可能就像OO的每一次作业一样,其中肯定会有你不会的东西,OO使我们提前体会到了这种感觉,也让我学会如何应对这种情况。

  • 此外,OO也让我们学会了一些实用性的技能,比如git的使用,IDEA的部分功能(IDEA真的太好用了!),多线程编程,设计模式等知识。

改进建议

OO真的已经很不错了,我在学习的过程中也很能体会到课程组的用心,不过都是自己人,我也谈谈我的想法。

  1. 理论课讲解内容的问题。

    • 关于理论课,我一个很直观的感受就是,理论课上我的收获很有限,完成作业所需的大部分知识都是课下通过其它途径学会的。OO的理论课可能是想给我们传达一个总体的思路,但结果就是似乎什么都讲了又似乎什么都没讲,从大家越来越低的出勤率上就能看出来。
    • 我的建议是,可以在理论课上课之前发一些预习的材料,让我们明白这节课要讲什么,有个预习的过程,否则课上讲的都是我们从没听过的思想,知识,真是听天书一样,很难跟上思路。
  2. 单元安排顺序的问题

    • 当前安排顺序是先难后易,在第一单元我们在没有什么知识基础的情况下,费很大的劲学习了如何完成作业后,在后面相对简单的单元,可能就会安于现状,不想再学更多的新知识了(我就是这样
    • 但是当前的安排方式使得OO和OS能够相互避开难度大的地方,让我们可以相对平稳的度过这学期,如果二者都是后半学期很难,那绝对是苦不堪言,所以感觉也不好有大的调整
  3. 第四单元指导书的问题

    • 在做第四单元的作业时,我很能感受到指导书对于每个接口的方法描述有些轻描淡写,有些特殊情况交代的不是很清楚,尤其是第三次正确性检查的部分。相比于第一单元指导书的面面俱到,逻辑严明,第四单元的指导书可以继续完善一下。
posted @ 2021-06-26 17:40  mjw0803  阅读(57)  评论(0)    收藏  举报