OO第四单元总结与课程总结
OO第四单元总结与课程总结
第四单元作业架构设计
总体分析:本单元作业的需求集中于对UML类图进行查询。对于查询操作来说自然的想法是提前预见到需要查询的内容,在一开始就采用适当的数据结构将必要的信息进行存储,以空间换取时间。在本单元的作业中我也是完全依据这样的想法来进行设计的。
第一次作业
本次作业只涉及类图,主要的需求是对类的内外信息进行查询,类内的信息包括属性、方法等;类外的信息包括父类、接口实现等。在课程给出的源码中,一个类只包含UML中定义的ID、name等信息,并不包含属性、方法、父类等其他信息。这显然是无法满足需求的。因此,在设计的过程中,我新增了MyClass类,其中就包含了所需的各种信息。在需要时,可以直接的查询得到相关的信息。类似的,我也新增了MyInterface和MyOperation类。在这些类的协助下,多数的查询操作只需要O(1)的复杂度,对时间复杂度进行了有效的优化。
第二次作业
本次作业增加了对状态机和顺序图的查询。经过简单分析就会发现类图、顺序图、状态机的元素之间是没有重叠的,可以说他们三者是互不影响的,因此在进行相关的查询操作时只需要在对应的类图(顺序图、状态机)中进行就好。关于类图的操作在第一次作业中已经写好,只需增加对另外两种图的查询就好。为了使程序结构清晰,我才用了分级的思路。MyUmlInteraction管理类图,MyUmlStateChartInterractin管理状态机,MyUmlCollaborationInteraction管理顺序图。最后再用MyUmlGeneralInteraction管理三种图。这种写法使每个类的长度得到了有效的控制。
第三次作业
本次作业增加了对传入的UML类图进行有效性判断的需求。类似第二次作业的思路,只需增加一个PreCheck类,按照规则进行判断即可。(UML图中省略了属性和方法)
四个单元中架构设计及OO方法理解的演进
第一单元
本单元作业的主要需求是多项式求导。在这个单元中最主要的是对面向对象的设计有一个总体性的认识。由于刚开始接触面向对象,因此在架构的设计上比较的随心所欲,具体的表现就是在写代码的过程中突然发现我需要单独建立一个类管理一个项,我就新增加一个类,最终的结果就是整体架构比较的繁琐,各个类的功能有很大的重叠。究其原因就是在动手之前缺乏对整体的思考。在这一单元的三次作业中,我经历了三次重构花费了很多精力。同时从我的个人感受来看,这一单元是最难的一个单元。通过这一单元,我初步窥探到了面向对象的基本思想和具体做法,这位我后三个单元的顺利完成打下了重要的基础。
第二单元
经过了第一单元的洗礼,我对架构的设计有了一些想法。根据需求我第一次作业就确定了主要的类应该包括:乘客队列、调度器、电梯三个部分。这种架构对迭代开发很有帮助,这一单元就免去了第一单元疯狂重构的痛苦。这一单元最重要的一部分应该是多线程的设计。由于是初次接触,死锁问题困扰了我很久。不过事实证明,实践出真知。在调式了很多死锁问题之后,在测试中我没有因为死锁问题出现过Bug,这也是对我的一点小小的鼓励。
第三单元
本单元主要是正确理解jml。但是由于把注意力过多的集中于jml上,反而对架构的设计有所忽略了。在第一次作业中,死板的根据jml进行翻译式的代码编写导致,出现了不少超时的问题。意识到问题之后后面的两次作业我也有意识的对架构进行了调整。但是有了第一次作业先入为主的设计思路,导致最终的代码架构还是不尽如人意。因此在第三次作业的bug修复中,我进行了一次不小的重构,才得到比较满意的结果。这一单元作业除了对jml的学习,使我感受最深刻的就是架构的设计是整个程序最最基础的部分,无论面对什么需求,这一部分都是需要好好思考的。
第四单元
本单元是我对自己最满意的一个单元。从设计的角度来看,在一开始就明确了各个类的功能和管理的数据,因此在迭代的过程中我只需增加新的方法即可,整个设计的思路是一脉相承的,我也真正感受到了迭代的乐趣。通过这一单元的实践,我认为对面向对象思想的掌握,我有了很大的进步,这给了我很大的肯定。
四个单元中测试理解与实践的演进
在OO的作业中测试是很重要的一个部分。在我的理解中测试应该要分为三大部分——基本的功能检查、极端数据、不合法数据。在我们的课程中比较关心的是前两种。对我来说,我比较在意的是功能的正确性,这一部分我的通常做法是构造全面的测试用例,进行覆盖性测试。而对于极端数据,一个是根据对程序的理解构造(比如第一单元的指数为0),另一种是随机生成大量的数据。对测试数据运行结果的正确性检查中,我常常采用对拍的方法。这也确实帮助我找到了很多的bug。但是我也必须认识到的一点是在测试方面我的自动化程度很低,相比使用测评机的大佬们,我还有很多需要学习的地方。虽然这学期的课程中我还没能搭建起属于我自己的测评机,但是我惊奇的发现我对bug出现的地方有了主动的预见性,在发现错误时我能很快的找到bug的位置并能很快的进行修改(这可能就是每注bug修复训练的结果)。
课程收获
第一点对java语言的熟悉。这门课是我第一次使用java语言,并且相关的使用方法基本上是通过查阅资料自学的。经过一学期的反复使用,我对java的基本语法、数据结构都有了比较深的认识。这也表明确实在掌握了一门语言后,对其他语言的掌握会起到事半功倍的作用。在预习作业中,我基本上就是边做边学,但得益于C语言的基础,因此简单了解java的语法就很快的写出简单的代码。同时由于java相比C语言,java有丰富的“轮子”可以使用,arraylist、hashmap等各种容器,因此可以使我更加专注于需求本身,而不是花很多的时间去编写结构体、栈等基本的结构。
第二点面向对象思想的初步形成。各种不同的问题有一个共性的特征就是针对一个对象做若干种操作。从这样的想法中,自然的就有面对一个需求,我先思考这个需求相关的对象有哪些、它们之间的关系是什么、每个对象可以执行什么样的操作。在把这个问题思考明白后基本的设计架构也就有了。
第三点实用的设计模式,比如:工厂模式、适配器模式等。在没有了解这些模式之前,我对设计模式的使用都是无意识无目的的,想到了什么就用什么。但是了解了之后,面对不同的问题,就可以使用不同的模式,这使代码的可读性和逻辑性都有了很大的提高。并且使用这些成熟的设计模式确实可以帮助我们简化很多的问题,不过我目前对设计模式的掌握还不够,但是OO为我推开了这一扇窗,我也会在之后的实践中多多的了解并使用这些设计模式。
改进建议
1. 预习作业的内容。这一学期的预习作业主要集中于对java语言的熟悉与使用。这对我的OO学习的确起到了很大的帮助。但我认为也可以增加一些理论上的指导,比如java中不同容器的优缺点等,这些内容可以通过推荐技术博客的方式进行,这样可以有效的减少同学们走了不必要的弯路。
2. 作业的发布时间。我认为在开启bug修复时就可以公布下一次作业的具体要求,这样同学们可以带着问题和思考听课,更有针对性;而不是在课上胡乱猜测这周的作业是什么,反而是课上内容没有得到很好的接受。
3. 实验的反馈。在实验结束后同学们只能得到是否提交成功的反馈,但是具体做的怎么样是没有反馈的,这使得每次实验过后不管正确与否,过去了就过去了,完全没有达到实验课的目的。有效的反馈可以使同学们清晰的知道自己对该部分的掌握是否到位、是否有理解错误。因此希望之后的实验课至少能给同学们正确与否的反馈,并且能提供正确的代码或者思路供参考,我认为这样同学们才能在实验中收获更多的东西。
线上学习课程的体会
线上学习对我来说有利也有弊。好的一方面是线上学习可以不断的重播,有效的解决了课堂学习由于各种因素导致的上课走神但缺没办法补上的问题,对不理解的问题也可以通过重播多看几遍。但是线上学习也有缺点,缺少同学们一起学习的氛围以及家里比较安逸的环境往往会使听课的效率降低。不过这一点可以通过重播弥补,但是更重要的一点是线上学习缺少同学们面对面的交流,设计思路、方法实现等其实每个人都有自己的想法,通过交流互相学习对开拓思路是很有效的。
简言之,虽然本学期的OO课程是在线上完成的,但是我也有很多的收获,自我评价也算是完成了课程的要求。最后,感谢各位老师和助教一整个学期的付出。