OO第四单元总结
在官方包对输入进行了初步的处理后我们只需要判断element的type进行分别处理即可,在构建时特别注意的是输入顺序,会出现类似先有类中属性再有类这种情形,所以为了避免错误我是先对输入进行分类,将不同种类元素放入各个list中再按照合理顺序挨个遍历list去进行图的构建,对于特定元素查询,例如class,我是新建了一个Myclass类进行数据管理,而在UmlInteraction中是用的key为id,value为Myclass的Hashmap进行查询,由于后续会有重名的判断,所以对于不同elements我还有一个key为name,value为id的Hashmap用于查询对应name是否重名,未重名则可得到对应id。本单元的难度主要来自于类的继承,尤其是接口,可以多继承,我自己的处理策略是类似并查集的实现,从某一个类(接口)开始,往父节点找,直到找到头或者找到已更新相关数据的节点,返回时路径压缩将经过的节点相关数据都进行更新并把更新标记设置为true,此后再访问到这个节点就可以直接获取数据而不再往它的父节点搜索。格式检查时的难点在于对于循环继承的判断,我的做法是深搜,从一个未遍历过或者未加入答案Hashset中的类开始搜索,搜索时更新经过路径,如果出现重复则说明有循环继承。另一个难点是对于接口重复继承和类重复实现接口的检查,接口重复继承检查的实现类似是上文所说的递归,在判断时如果父亲接口已经重复继承了那么子接口也重复继承,没有则去挨个进行元素判断,而类重复实现接口的检查需要考虑父类和子类实现接口的关系,父类若重复实现则子类也重复实现,若父类没有重复实现,则把父类实现的接口和子类实现的接口进行合并看是否存在重复,对于类实现的接口还需要考虑到接口的多继承。
2、总结自己在四个单元中架构设计及OO方法理解的演进
第一单元
现在回看自己第一单元的代码属于是惨不忍睹,几乎是高耦合低内聚。第一单元表达式主要是为了提升我们架构设计的能力,将一个复杂的问题进行细分,再处理,难的地方是如何做到良好的可拓展性,另一个是分而治之以后如何合并答案以及进行优化。在第一单元第一次作业就完全没考虑到可拓展性的问题,于是第二次作业就完全重构了,也得益于第二次的重构,第三次作业写的就很轻松,感觉第一单元对我影响最大的就是写代码时不能只考虑眼前的苟且,还有迭代,以及将某些有共性的元素划分为一个类,在通过继承的方式实现多态。
第二单元
第二单元多线程电梯,刚开始第二单元时理解多线程的原理花费了很多时间,因为对于那时的我来说,多线程运行是一个全新的东西,以前写C面向过程时从未接触过。理解以后就到了麻烦的同步互斥问题了,最令人头疼的是bug的不可复现性,发现死锁了,准备找bug,第二次运行可能就能正常运行了,也就是n次正常不代表没问题,一次死锁那就一定有问题,当时出现死锁也就能从代码本身逻辑上去分析,然后构建可能死锁的访问序列去判断。当不会有死锁发生时就要考虑如何调度能够使得效率增加,虽然考虑了很多理论上优化的操作,但实际测试确都是负优化,所以代码运行不能脱离实际。
第三单元
第三单元JML主要是考查的对于JML规格的理解与实现,当然这种实现不能生硬翻译JML语言,否则性能可能会很差,所以要结合图论中的算法对于具体实现进行各种优化。JML的学习让我对于规范化代码有了更深层次的理解,自然语言的描述难免会出现二义性,JML则可以很好的避免这一点。这一单元总体结构由官方代码给出了,所以我们只需要选择不同的容器进行数据的存储以及构建不同信息的图模型进行查询与计算
第四单元
第四单元则是UML图模型的构建,由于UML图的层次结构十分清晰,自顶而下依次用合适的容器对元素进行存储,再在具体类中构建上下级关系,最后根据需求进行数据分析处理即可完成,这一单元主要花费时间的原因还是对于UML的不熟悉,对于好多地方不确定是否有这种关系以及可能需要反复复习元素与元素之间不同关联的含义,而涉及到图论的算法难度并不算大。
3、总结自己在四个单元中测试理解与实践的演进
做第一单元前两次作业时没有写自己的评测机,导致第二次作业出现很多bug,在互测屋中被疯狂hack,于是第三次就开始尝试用C语言和python写评测机,用C语言进行随机表达式的数据生成,然后将代码结果与经过python库函数运算的结果进行比对判断是否正确。
第二单元多线程电梯没法借助python去完成正确性检验,所以除了需要自己写构造数据的代码外,还要写正确逻辑判断的代码,让我也体会到了写好一个代码和它的测试代码同样重要也同样复杂。
第三单元的测试依旧是依靠C语言生成随机数据集并与同学对拍进行正确性检验,再输出时加上运行时间用以判断代码的性能好坏
4、总结自己的课程收获
学习了OO课程让我真正意识到了人的潜力是可以被无限激发的,许多次我拿到OO作业都感觉无从下手,或是写了一半写不下去了,又或是决定重构时的崩溃,但令我感慨的是最终都坚持下来了,没写完OO时整日整夜在图书馆码代码是我这学期最难忘的经历,毫无疑问,这让我提升了很多。大一时的我写个200行代码几乎已经是极限了,现在几乎每周都是近千行代码,让我真真切切看到了自己码代码功力的提升。另一个很大的收获是学习到了不敢说OO的精髓,至少是OO特别的思考问题的思维,而且我认为这种思维更能使得代码层次结构分明,还学到了多线程,JML,UML等等新知识,所以十分感谢有OO这门课程。
5、立足于自己的体会给课程提三个具体改进建议
一、不是很清楚为什么作业开放设置在每周三晚上,所以个人感觉或许设置在周三中午会比较好?许多次周三下午空闲的时候想写OO但是发现却没有开放,难免会有些失落
二、虽然直到助教也很不容易,可是还是希望在每次作业布置时能够把要求说的清楚些,不然每次对于一些模糊的要求总是会纠结很久。
浙公网安备 33010602011771号