面向对象第四单元总结

时间如白驹过隙,不知不觉间,火车达到了终点站。以前总盼望着,盼望着旅程的结束,但真正结束的时候,心中还是很不舍得。这一路上,有痛苦,有困倦,有难过,但当然也有喜悦与欢乐。得到了人生中的第一个进步奖,是意外之喜,是意外之获,感谢所有帮助过我的老师和助教,感谢所有给予给我帮助的室友、同学及朋友,感谢自己没有放弃自己,感谢自己的坚持,是这些,带我成功的来到满是鲜花和掌声的终点站,骄傲的站在这里。

 

Part1 :总结两次作业的架构设计

第一次作业:

第一次作业的需求是对类图的查询指令,首先输入一个类图的模型,接下来输入对这个模型查询的指令,对这些指令进行正确的响应。所需考虑的UML类图中的元素有类、接口、类中的操作及类中的属性,关系要考虑类与类、接口与接口间的继承关系,关联关系及实现关系。我的设计架构如下,首先与MyUmlInteraction类交互的是ClassType类与InterfaceType类,操作类和属性类隶属于ClassType类,由于类与接口间有实现关系,因此ClassType类与InterfaceType类也有交互关系。

在这次作业中,最在其中捣乱的便是继承关系,因为一旦两个类或两个接口之间有了继承关系,则子类便会拥有父类的全部操作、属性及各种关系,对于此,我的解决方法是使用dfs算法进行遍历,将父类中的操作、属性及关系加入到子类中,每个ClassType类仅需遍历一遍,但对于InterfaceType类并非如此,由于接口在java中是多继承的,因此若每个InterfaceType类只遍历一遍,是无法完成任务的,需要对每个InterfaceType类进行一次遍历,将每个类所继承的都加到其对应的直属子类中。

为了降低复杂度,我使用了大量的Hashmap、Hashset数据结构,由于这两种数据类型查询的复杂度均为o(1),我就尽量用他们做映射。并且这次的需求是静态构建好一幅图,动态查询,因此我选择将所有建图和运算放在构造函数里,这样能尽量降低查询的复杂度,从而降低整体的复杂度。

 

 

第二次作业:

这次作业在第一次作业的基础上加入了对顺序图和状态图的查询,以及对类图是否符合三种规则的检查。我的架构是在上一次作业的基础上进行扩展的。增加了State Machine类和Interaction类,分别用来管理状态图和顺序图中的元素。数据结构上还是采用了大量的Hashmap、Hashset,以降低程序的复杂度。

我认为这次作业最难的是对三种规则的检查,最开始我的写法是在将父类的元素加入到子类的过程中一起进行规则的检查,开始以为自己写的很对,但中测的两组隐藏数据始终未能通过,在室友的提醒下,我将三个函数注释交上去发现竟然通过了,于是才意识到是这几个函数的问题,检查了很多遍始终没有发现问题,于是换了一种比较傻的写法,即对每个元素都进行一遍检查,这样虽然保证了正确性,但效率大大降低,之后还要找同学请教有什么更好的写法。

 

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

这门课我们最该学到的思想应该就是面向对象的思想,这是这门课和之前像C语言、数据结构这些课最大的区别,也是需要在实践中不断体会、参悟才能理解的,在这条路上,开始我并没有很顺利,好在通过认真听课,认真完成每次作业,向同学请教,我才稍稍入了一点门。

第一个单元是有关表达式的求导计算,都说万事开头难,这个单元是最令我痛苦的一个单元,费力不讨好便是我对这个单元架构的总结。开始的前两次作业我基本是用java的语法写C,完全可以说是面向过程,这三次作业的架构如下:

  • 作业1

  1. 将输入的表达式放入动态数组list中(若有连续空白字符,只存一个)

  2. 初步判断表达式是否符合规则

  3. 用 + - 号分割字符串(将分割字符串的+ - 号位置记录在动态数组Mark中)

  4. 判断每个项是否符合规则(* 号分割每一项)

  5. 将系数和指数分别存在coe 和ind 数组中

  6. 合并同类项,计算出导数并打印出来

  • 作业2

  1. 将输入的表达式放入动态数组list中(若有连续空白字符,只存一个)

  2. 初步判断表达式是否符合规则

  3. 用 + - 号分割字符串(将分割字符串的+ - 号位置记录在动态数组Mark中)

  4. 判断每个项是否符合规则(* 号分割每一项)

  5. 将系数和指数分别存在coe 和ind 数组中(每一项均为k*x^a*sin(x)^b*cos(x)^c)

  6. 合并同类项,计算出导数并打印出来

  • 作业3

  1. 建立三类(表达式、项、因子)

  2. 输入一个式子,new 表达式;用正负号拆分成项,new 项;用*拆分成因子,new 因子

  3. 若是简单因子(带符号整数、sin(x) cos(x)、幂函数),则返回求导结果到项

    若是表达式因子,则去掉括号 new表达式

    若是嵌套因子,则剥去一层,new因子

    若不符合这三类因子,则格式错误

  4. 项的求导结果返回到表达式

  5. 若不是格式错误,则打印出导函数

前两次作业是完完全全的面向过程,第三次作业只好进行了重构。三次的强测成绩都没有很理想,心中的挫败感十分强烈,很是难受。

第二单元是电梯调度,最难的便是对多线程的理解。经过了第一个单元的沉重打击,我重新振奋了自己的精神,上课努力跟上老师的思路,也逼迫自己改掉直接动手写程序的恶习,先设计好、思考好再动手。功夫不负有心人,这个单元我有了很大的进步,三次作业我的大的架构没有变化,只是一些小的细节有一些变化,我从现实生活考虑,分为三类,人、电梯和调度器。人又分为两种,在电梯外面苦苦等待的人和美滋滋已经坐上电梯的人,于是我设计了两个队列,一个是在电梯外面的,一个是电梯内部的。电梯外部的队列为一个数组,每个元素为在这层想要上行的队列及想要下行的队列,一共有楼层那么多个元素,对应每一个楼层;电梯每上一个人,将其从外部队列中删除,加入电梯的内部队列。外部队列归调度器管辖,内部队列由电梯自行管理。通过模拟现实中人上了电梯后要按层数,我在电梯内部建立的一个数组,对应每一层,标记每一个进电梯人的目的楼层,在他们出去后再擦出这个标记。这样,大家各行其是,分工明确,不会相互推卸责任。

再接再厉,跟着第二个单元的感觉,我开始了第三个单元的挑战,第三个单元,是极为数据结构的一个单元,它的最大特点是每次的需求都是在上一次作业的基础上添加的,这对程序的扩展性要求是非常高的,我研究了大量的图的算法,降低复杂度,我对这个单元的表现也还是非常满意的。

我觉得我可以骄傲的说自己的进步还是很大的,一只脚已经踏入了面向对象的大门,并且改掉了直接动手写程序的毛病,做到了先思考好再动手,为自己点赞!

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

关于测试,是自己做的不太足的一方面,在这方面也没有十分大的进步。开始时自测的方法就是构造数据然后用手算,然后跑程序看对不对,后来数据集大了,就和同学互拍,对比跑出来的结果是否正确。互测的话就是把自己构造出来的数据用别人的程序跑,错误了就去刀别人,这可以说是撞大运的方法。主要是我把大量的时间花在了构建程序结构和写代码上,测试做的没有十分充分,这也让我每次查分数的时候十分紧张,心中没有很有底。但测试在未来工作中是很重要的部分,以后我还需要多在这方面下功夫。

Part4:课程收获

这门课程很磨人,陪伴我度过了这个学期的每个周末,我也花了大量的时间和精力在这门课上,我一直坚信着“天道酬勤,功不唐捐”,有付出就一定会有收获,我在这门课上的收获是这学期所有课程中最大的一门,不光是学会了一门java语言,学会了面向对象的思想,我觉得更多的是写程序方法上的进步,是心智上的成熟,是抗压能力的提高,每次觉得自己完成不了的时候,总有一种力量支撑着自己,就是在这一步一步的坚持中,我发现自己的潜力真的是无穷的,那么多看似自己做得不到的,自己都完成了,完成的效果有时也是很出人意料的。上台领进步奖的时候,我笑的一定很开心,很幸福,得到了肯定。虽然我没有很聪明,但努力就一定会有进步的,我坚信这一点。

Part5:改进建议

1.实验课程安排不太合理。上午3.4节上完课后,下午6.7节就要上机。虽说上机主要考察对课上内容的理解,但我觉得间隔的时间太短,没有足够的时间消化,这就导致课上实验时比较慌。而且课上实验的难度忽高忽低,有时候做不完,有时候很早就能完成。

2.分享课上大佬的分享有时很难懂,也许可以请一些不那么厉害的同学讲一讲自己的思路和问题,这样能更有助于大家的进步。

3.希望可以分享一下每个单元的标程(如果有的话),希望能从中学习。

posted @ 2019-06-24 19:57  Lisabo  阅读(126)  评论(0编辑  收藏  举报