OO Unit 4 Summary

OO Unit 4 Summary

第一次作业

架构设计

第一次作业关注于类图,需要实现一些查询方法。

我采用了适配器模式(多亏了实验课学到的知识),将每个UmlElement封装为自定义类UmlxxxxxParser。由于UmlElememt的构造方法不是public,我采用对象适配器。Parser功能如下:

  • 提供element原有功能。每个Parser中将对应的Element作为成员变量,对外提供getNamegetId等等访问接口,从而对于Element的方法访问可以直接通过parser进行

  • 记录额外信息(封装的主要目的),例如每个Class包含的operation、attribute,每个Operation是否是Non-Return等等

然后我建立了一个全局的parser类,在要填写的类中构造一个该类对象加入成员变量。parser的行为包括(按照执行顺序):

  • 将所有类、方法、参数等等进行归类,并建立对应的Parser存进不同的arraylist,并建立所有id到parser的map

  • 建立类和类、类和接口、接口和接口间的关联、继承、实现关系

  • 将参数加入对应方法,将方法、变量加入对应类中

  • 对外提供按照class的name访问class的接口(并抛出异常)

最后在实现的类中调用parser的接口得到对应的类,并进行类的属性、操作的相关查询,其中寻找实现的所有接口使用了树的广度优先搜索。

 

 

 

bug

由于使用了自动测评+中测强度尚可,在强测中没有出现bug。

 

第二次作业

架构设计

第二次作业增加了顺序图和状态图,提供查询方法。由于面临OS考期,课程组将作业压力减轻了一些(代价是去年一次作业的内容拆成了两次,并在后一次作业中增加了一些内容)。

架构与上次类似,由于三种图互不交叉,所以使用三个整体parser处理,多封装了顺序图和状态图的几个相关Element类,增加操作例如在每个状态中保存其直接后继状态。唯一值得一提的是将finalstate、pseudostate、state三个类的parser统一继承自一个generalstate的抽象类,提供getNextStateCount方法,从而三个类可以统一处理,从而不必写很多冗余的if-else和类型转换,也不易出现错误。

实现的新方法本身比上次更简单,大多数只需直接访问对应的lifeline/statemachine即可,只有后继状态涉及到图的广度优先搜索,也并不复

bug

强测中出现了一个bug,即顺序图中message的接收方为UmlEndPoint的情况,原因本质来说是UML图的理解不够完善,直接来说是代码没有较好的规避异常机制(例如在类型转换前判断类型)。

 

 

第三次作业

架构设计

第三次作业增加了UML规则检查的内容,要求在建立模型后、查询指令前依次判断规则001~008,若不符合规则则立即报错结束。

架构沿用前两次的设计,对于前六条类图的规则,在类图的parser中检查;后两条状态图的规则在状态图的parser中检查。002、003、004采用了广度优先搜索,其他的算法没有什么可说的(虽然有些许坑点)。其中002找环路我用DFS写结果频频出错,两个小时后无奈改用BFS终于成功,可以说体现了我的数据结构水平

中测修bug花了很久(大家都卡在middle5,错误原因各不相同),长时间以为是002~004(毕竟对自己的数据结构水平不放心),最后发现是005的判断出了错,判断孤儿attribute不小心写成了判断孤儿parameter,修改后总算是通过了中测,OO作业收官~

 

 

bug

强测没有出现bug,完结撒花~(更新时间:6.14 12:15)

 

本学期架构设计演进

本学期四个单元的高强度作业、实验带来了架构设计上的水平提升。第一单元,从第一次作业近乎完全面向过程的设计,到第三次作业OO化的抽象化建模(将项与运算均作为同一类对象处理),对于继承和多态的理解愈发深刻。

第二单元深入理解了多线程,完成了学期最高难度的多部多线程不同功能可换乘电梯的调度作业,对于并发设计有了深入理解。

第三单元侧重于契约式设计,具体学习内容为JML,同时顺便锻炼了数据结构算法能力(dijkstra、dfs、甚至有的同学用的tarjan/并查集)。

第四单元主要学习UML图及模型设计,而作业内容则通过解析UML图来学习UML,顺便练习架构设计。

可以说经过了一学期的学习,在架构上从完全不知如何进行OO开发,到可以自然想出OO化的设计,进步还是很明显的,无论是顶层架构设计还是底层编码实现,都有了显著提升。

 

本学期测试技巧演进

本学期学到了诸多测试技巧,例如黑箱测试、JUnit单元测试等。最主要的测试方法还是编写自动评测程序进行黑箱测试。我从第二次作业开始编写对拍程序,在每个单元更换生成器和正确性判断方法,一直用了一个学期,整体上效果还不错,强测没有出现过多的正确性的bug(主要是是性能分、TLE等)。黑箱测试随机生成数据比较无脑粗暴,还可以用来进行互测,且不需要阅读他人代码,还是比较省时省力的。

广告:自动测评已经发布到github~不过由于核心部分是迭代开发,前面几次作业的可能存在bug,但值得一试~ 链接:https://github.com/wzk1015/Object-Oriented-Design-Autotest

 

课程收获

昆仑课程名不虚传,压力真是山大,一周1k行啊

除了上面说的编码能力、架构设计能力的提升,感觉也提升了软件开发的综合能力,并通过高强度训练增加了自己吃苦耐劳的能力(为996做准备)

更具体的来说,对于java语言也有了很多了解,认识到了java作为典型面向对象语言的特征,在工程开发上极佳的适用性(特别是虚拟机、跨平台等),现在java可以作为python之后我第二倾向的语言,工程化设计上的首选。

广告:娱乐项目console三国杀正在开发~欢迎来star,链接:https://github.com/wzk1015/sanguosha

 

课程改进建议

1、实验课公布正确答案和成绩,这样大家在实验后也可以学到知识(相当于bug修复),对于自己的成绩也有个预估;

2、减少数据结构算法、时间性能优化上的侧重,个人感觉现在有点过于侧重这方面了,其实在架构开发上还有一些可以研究的;

3、第三单元提升中测强度,中测留一手强测捅成狗不太友好,希望中测和其他单元持平(并且可以多开放一些中测点的数据,毕竟强测的区分度也挺大的)

4、其他单元希望中测数据点能全部开放,例如像寒假pre一样在ddl前若干小时开放等,不然大家不知道错在哪里,只能花很多时间做黑箱测试,白白浪费时间而得不到提升

5、自动测试可以给予指导,例如在实验课内容中增加,现在实验课学习了JUnit,实际上感觉自动测试也可以简单指导一下,否则目前唯一的学习来源是研讨课(还取决于有无同学进行分享)

6、相对于作业侧重自学,实验课实际上是一种不错的学习方式,给了我们接触各种设计模式的机会,或许以后可以减少作业的权重,而在实验上增加一些新知识让我们学习?

7、网课内容有点过于抽象,而且有些内容老师反复说了好几页PPT其实意思相近,反而容易让人迷惑,感觉课堂中可以加入更加具体的内容(当然这也可能是线上教学带来的影响,老师和同学都不太适应)

 

线上学习体会

特殊时期特殊上课方式,我们竟然在家里学完了一整个学期的OO课。所幸这门课本身自学成分居多(特别是代码实现层面),没有影响到教学质量,作业依然带给了我们在短时间内完成千行级别的工程开发能力,实验课依然能够学习到设计模式等重要的(但过于具体因而没有在录播课中涉及的)知识。唯一可惜的是研讨课有所影响,听说研讨课本来是可以邀请业界开发人员来办讲座的,看来我们错过了一些不错的学习机会。

所幸的是线上教学没有影响到教学氛围,大家在群中的讨论依然非常活跃,互相给予了非常多的帮助(在此感谢帮助过我的大佬们)。作为一门不以考试为核心而以作业为重点的课程,OO的压力都在平时,因而这样的讨论氛围还是非常有必要的。

现在回想起寒假pre2时照着指导书才敲出public static void main的自己,感觉提升是真的很大,也不辜负这么长时间的压力与付出了。

posted @ 2020-06-12 00:32  -Limbo-  阅读(204)  评论(3编辑  收藏  举报