OO第四单元——UML——总结暨OO学期小结
作者:互联网
OO第四单元——UML——总结暨OO学期小结
分为如下内容:
- (1)总结本单元三次作业的架构设计
- (2)总结自己在四个单元中架构设计及OO方法理解的演进
- (3)总结自己在四个单元中测试理解与实践的演进
- (4)总结自己的课程收获
- (5)立足于自己的体会给课程提三个具体改进建议
- (6)谈一谈线上学习oo课程的体会
一、总结本单元三次作业的架构设计
第一次作业
第一次作业是第一次了解到UML图的知识,需要首先搭建好一个设计架构。虽然给了非常繁多的其他文件,但抓住主要重点models/elements后,把每个UMLModel的源代码都仔细研读了一遍,梳理好各自的联系和层次关系后,决定将各个层次的模型分类进行处理,比如关联使用UmlAssociationManager管理等,最后使用UmlElementHandler将所有elements进行分配包装运输给每一个管理类,有类似工厂模式的意味。类图如下。
具体实现管理时,首先预见了之后的迭代开发,在管理数据时运用了多个HashMap,根据不同的标准将数据分类存储,比如根据id、name、class包含关系或者interface包含关系存储attribute等,虽然有一些存储关系这次作业并没有用到,但是对后面迭代开发时有了很好的辅助作用,有些直接调用即可,减少了麻烦。
private HashMap<String, ArrayList<UmlAttribute>> name2attributes = new HashMap<>();
private HashMap<UmlAttribute, UmlClass> attribute2class = new HashMap<>();
private HashMap<UmlClass, ArrayList<UmlAttribute>> class2attributes = new HashMap<>();
private HashMap<UmlAttribute, UmlInterface> attribute2interface = new HashMap<>();
private HashMap<UmlInterface, ArrayList<UmlAttribute>> interface2attributes = new HashMap<>();
但第一次作业这样写出现的问题就很多,虽然过了中测并且自己也进行了充分的测试,但是由于有些数据虽然存储处理了但是在测试的时候并没有对这些数据存储时的操作进行特别多的验证,导致强测的时候发现很多hashmap查找没有预先判断containkey等的问题,非常的可惜。
第二次作业
第二次的增量不是太多,主要加入了顺序图和状态图,二者是相对独立的,通过讨论区的帖子和代码将新增的各个element属性再次进行分析分类处理,加入了UmlStateMachineManager和UmlInteractionManager分别管理状态图和顺序图的内容,由于是根据element的type进行包装分配的,可以完美的适配第一次作业,只用稍微修改交互类对新增类进行交互即可。类图如下。
具体实现方法变化不是太大,这次主要是统计各个数据的数量,由于前期工作的顺利铺路,数据早已经根据各个类别、层次存储好,统计数量时只需要调用方法进行获取数量即可,如果需要进行去重操作时,再使用hashset的add或addall方法进行自动去重就可以,实现和完成难度都不是很大。第二次作业经历过炸裂后也格外的小心,将边边角角的问题都进行了单独测试,最后也终于得到了100分。
第三次作业
第三次作业增加的是对模型进行有效性检查,增加了checkmanager类,总的来说根据检查规则从001写到008方法就好,和前两次作业的关系并不是很大,但是这种比较面向过程的作业对基础相对薄弱的我来说感觉还是有点苦手,幸好这次的时间限制放的很宽,不需要绞尽脑汁查资料找特别复杂的算法,但有效性的检查有几个办法比如001、003、004等需要考察的细节很多,weak4+middle5有段时间一直在debug不太能过去,最后和同学进行对拍时才发现是自己001题意理解成了自己这端...最后一次作业让我发现经过一学期后,自己反而从开始的面向过程的思维到现在更加注重程序的架构问题,反而还有点忽略了程序内核的实现,每次炸的作业都是算法不过关或者对题意阅读理解的问题,有点捡了西瓜丢芝麻的意思。类图如下。
第三次作业写了很久,debug时也在自我怀疑的漩涡中漂流,由于第一次作业炸过,虽然第二次作业强测没有问题,但是在反复尝试终究不能过中测后,开始对有效性之外的代码是否存在问题产生了怀疑。于是又是经历了一次次反复的对之前代码的检测才最终笃定是有效性检查的问题。在对拍之后发现自己题意理解错时是真的只能苦笑。也算功夫不负有心人吧,其实也有一种置之死地而后生的感觉,最后一次作业也圆满收官,获得了100分。
二、总结自己在四个单元中架构设计及OO方法理解的演进
第一单元
第一单元总主题为表达式求导,三次作业分别的要求为多项式求导,带有幂函数、三角函数的求导和最后一次带有嵌套和表达式因子的求导。大致分为了输入部分、合并处理部分和输出部分。输入部分从最开始的大正则判断wf到之后运用递归思想分层次进行判断,先三角,后多项式,进行切分。合并处理部分将表达式分为一个个小项进行分析,调用Handlefactory类在内部对不同的因子进行不同的筛选判断,通篇都是对递归和嵌套的处理,完完全全的面向过程处理。
第一单元算是第一次对面向对象的尝试,寒假的pre勉强是让我明白了java是怎么写的(因为大二上有数学双学位的课没办法选java的课),但确实自己并没有达到将思维从面向过程到面向对象的转换,早早的就领到无效作业对自己的打击是非常大的,那段时间真的很多时候觉得就这样了,就算不挂科大概成绩也不会很好之类的,还好最后还是自己缓了过来,提前学习了多线程的知识,希望自己能翻盘一次,不为成绩也为自己能多学点东西。
第二单元
第二单元为电梯调度,主要训练的是多线程相关的知识。三次作业的设计结构都采用的是生产者——消费者结构,即Input输入作为生产者,Elevator电梯作为消费者,中间采用Controller作为共享对象的模式。主要分为线程类(Elevator、Input)和资源类(Controller、Building、Scheduler),其中Building类将整幢建筑视为整体,内部装有Floor类用来记录每一层的请求队列,将整个等待队列细分化处理,Scheduler类是第三次新增类,专门用来执行换乘操作,用到的换乘方式是平均分配+打表的方式。
多线程是一个非常有趣的东西,它一方面带来了效率和交互的方便,另一方面又带来了可怕的线程安全问题。经过梦一样的第一单元后,第二单元开始非常着重架构的设计,哪怕是开始的时间晚一点也必须要注重程序的可塑性和可拓展性,debug和全部重构都是很痛苦的事情。
第三单元
第三单元为JML语言的学习。架构设计由于完全依据课程组的规定,也没有自己创建新的类,过多的地方是专注在了算法的优化和单元测试上。因此这个单元对面向对象的运用自我感觉并不是那么透彻,重点还是过多的放在了图、表等算法的考究。
JML作为规范化编程,给编程可以进行形式化验证提供了一种可能性,我们也可以使用工具分析JML进而进行自动化测试,在写博客时也进行了尝试,虽然现在确实很不成熟,但这个自动化测试的想法确实很好,也希望它能一直继续发展下去。
第四单元
第四单元的大体架构设计在第一次作业已经作出介绍。
同上文提到的,到了第四单元的作业,我已经从一开始写作业时,动笔就开始一main到底到了现在首先花大时间对题目中的属性进行分类、层次化管理,在一开始就对程序进行大体上的解构,虽然第一次作业的失败感觉有点矫枉过正的意思,但面向对象的学习确实是给我提供了一种与以往写代码截然不同的思考模式,将程序进行解构、分析、再组装的过程是一种全新的体验,在类与类相互协作工作的同时,也让我从最开始的挫败感到略微的获得了一点乐趣。
三、总结自己在四个单元中测试理解与实践的演进
第一单元
第一单元由于自己一直挣扎于数据的处理,对于自动化测试方面的学习时间非常吃紧,更多的时候开始倾向于手动构造数据+和同学对拍的模式,由于自己没有自动评测机,写程序时候更多是写一部分,测一部分,着重于边界数据,确保前面写的都没有太多问题再进行下面的书写。
第二单元
第二单元由于电梯本身的限制性,数据的可能性总共也只有几百条,手动构造数据进行组合就可以很好的覆盖所有可能性并且优化自己的性能。但有时候会出现非常罕见的死锁问题,本地是不好复现的,这个时候通过评测机的黑箱测试才能测到锁之间的结构问题。
第三单元
第三单元第一次接触到了单元测试,Junit对本人来说还是十分好用的,因为自己习惯了写一部分测一部分手动构造边界数据+和同学对拍使用评测机的方式,junit可以很好的满足我一部分一部分测的需求。
第四单元
第四单元由于测试数据形式的特殊性,测试相对来说是比较困难的,需要自己画图覆盖所有情况,同时由于自己的数据处理相对来说比较复杂,也容易忽视一些细小的问题,因此采用了自己构造数据+同学构造数据+对拍的方式,最大化覆盖程序的边边角角。从第二次作业和第三次作业来看效果还是很不错的。
四、总结自己的课程收获
收获总的来说是多方面的吧,最重要的是面向对象本身知识的学习,还有的话算是协作能力的提升和心态的锻炼吧。前面也已经提到了面向对象过程对我写代码思维的拓展,同时每周的作业push也让我主动的寻找大量资料进行精进,这个过程对我来说就已经是潜移默化的在提升自己的能力了。自己认为通过oo的学习,自己和同学的关系也相对来说变得更加紧密了吧,学着一样的东西,烤着同一团火一起取暖,有时候一起苦哈哈的熬过来完成任务,心里还是酸酸甜甜的。
心态的锻炼也确实算是——非常到位。高强度的push是一条,还有一条就是自己一开始的第一单元就非常失败。自己的心态一直来说也非常容易受影响+容易敏感,计组实验上机的时候也有几次就是因为自己心态紧张最后没有完成,只能下周继续。不过现在好说歹说也都熬过来了,自己学到的知识和花的努力也一点不比其他人少,成绩感觉也没有那么那么重要了,对自己心态的锻炼对以后的生涯来说是难能可贵的。
五、立足于自己的体会给课程提三个具体改进建议
1.我确实也不知道是不是自己的问题,第一单元对我来说真的真的是非常棘手,哪怕是现在我还是觉得心有余悸,建议是调整一下顺序,或者降低三次作业的难度梯度。(虽然好像提到了很多很多次,但是第三次作业当时写的过程到最后星期六的结果真的让我非常非常难过QAQ)
2.研讨课可以更改一下形式,或者提高一下门槛。不知道是不是线上研讨的原因,大家的参与度不是特别高,研讨课在后面的时候的积极性和含金量都稍显不足,可能回到线下问题就会改变吧,我也不是特别清楚。
3.看到有人说反馈实验结果,我觉得给一个标准答案就好,知道自己写没写对并作出改正我觉得还是很重要的,不然都不知道自己这块知识有没有学好嘛。至于实验成绩倒不用那么急知道吧,学到东西才重要。
六、谈一谈线上学习oo课程的体会
对我来说线上其实非常好,时间可以自我分配,不用爬起来去教室上课减少了很多很多的通勤时间。唯一不太好的就是讨论要麻烦一点,但自己和同学努努力还是能进行的,就是时间花的多一些,可能也不太充分,前期确实学的难过了些。
emm感觉写了好久,平心而论自己对这门课是有遗憾的,但也是没有后悔的话,毕竟无效作业振作过后每一次的作业还是实验都对心里默念自己要拼尽全力补坑,在这样的信念下学习效果感觉挺好,虽然也没有很完美,但至少也没有再无效了(好卑微真的好卑微)。不管了,还是那句话,学到东西才最重要。:)
标签:OO,架构设计,HashMap,作业,总结暨,自己,UML,单元,进行 来源: https://www.cnblogs.com/ikutaerika/p/13138624.html