oo第四单元作业总结
一、本单元两次作业的架构:
本单元两次作业的架构基本是一致的,所以两次作业的架构就一起说了。
为了避免查询时出现同一个结果反复计算的情况(连续两次查询一个类的顶级父类,如果我们在查询的指令中来计算其父类,那么就需要进行两次重复的计算。)然而如果我们在实现Umlniterface接口的时候,就根据已经解析好的elements信息来把可能会被查询的所有数据都提前算出来存好,查询的时候就把他提取出来就可以了。
基于这种考虑,这两次作业我采用了这样的结构:首先,用一个类来实现官方给出的接口,这个类只有接口给出的查询功能。至于具体要查询的内容,需要另外创建一个类,这个专门用来存放和构建各类查询会用到的hashmap。
二、我对面向对象概念理解的演进:
面向对象课程的第一单元,是和我们以前学的c语言这样面向过程的基本无差别的内容,这一单元中,主要还是在熟悉c语言的语法结构,但同时,在第一单元三次作业的不断重构和优化的过程中,我也慢慢体会到面向对象的封装性的好处,这个好处有两个方面,首先,一个具有良好封装行的代码,比较容易修改,因为不同类之间很多内容彼此之间是不可见的,这带来的好处就是,你在修改一个类时,不用考虑另外一个类的太多牵扯;其次,两外一个好处就是,良好的封装性一般也就意味着一个优秀的架构,一个优秀的架构能让你在写代码时思路更清楚,同时写出来的代码也更具可读性,具有更良好的可修改行。第二单元的作业,专注于多线程,这是我之前从未接触的一种编码思路。第三单元是jml语言的学习,通过这一单元的学习,我体会到了在编写一个工作量比较大的代码时,如何与人协作,当然,在这一单元的代码性能要求也是我之前没接触过的,在写这一单元的作业时,我学习了很多优化性能的算法。第四单元是uml的学习,这一单元感觉上作业的内容,重点和难点都不在uml上,而是统计uml的算法,本质上和第三单元没太大差别。
三、课程收获
面向对象课程给我最大的收获有两个方面。首先,面向对象是一种不同于我以往所学习的编程思想,他是针对的不是事件执行的过程,而是参与事件执行的对象。比如电梯从1楼到5楼的过程,以面向过程的思路来看待这件事儿,就是单纯的电梯前往乘客所在的楼层——>电梯开门——>乘客进入电梯——>电梯关门——>电梯运行到目的楼层——>电梯开门——>乘客出电梯,这样一个事件的完整执行过程,然而如果从面向对象的角度来思考这一过程,就要分为两部分来思考——乘客和电梯,乘客有名字,出发楼层和目标楼层等属性,以及进出电梯的方法,电梯有停靠楼层的属性,以及向上下运行,开关门的方法。然后用电梯对象和乘客对象的这些属性和方法来组成整个事件。
面向对象给我的另外一个收获,是对于多线程的理解。多线程对于我来说是一个全新的概念,线程之间同步异步,交互以及死锁,是一种全新的写代码需要考虑的因素。
四、对课程提出的几点建议
(1)首先是对于互测环节的一点吐槽(针对第三单元),由于第三单元互测的数据量都很大,所以从数据从数据上很难找到自己程序中在强测之前就没找到的问题。而且,更为重要的一点是,很多bug是性能上的问题,这个优化要满足大佬们数据的要求真的很难,就出现了被狼人狂刀而无法自救,心态炸裂的问题。
(2)然后是关于强测数据点给分的问题,由于很多时候强测数据都会不可避免地对一个问题进行反复测试,这样就会出现由于一个bug而倒是全盘崩溃的局面,建议debug阶段,对于强测部分的debug,如果是合并修复,能够返回多一点儿的分数。