OO第四单元UML作业总结&课程总结
OO第四单元UML作业总结&课程总结
一、本单元作业的架构设计
第十三次作业
UML图
-
架构设计简述
-
本次作业要求实现对于类图进行解析
-
把需要解析的
UML图的各个元素分成三个层次UmlClass、UmlInterfaceUmlAttribute、UmlOperation、UmlGeneralization、UmlInterfaceRealizatio、UmlAssociationUmlAssociationEnd、UmlParameter
-
自建
MyUmlXxx类对其中一些元素进行封装MyUmlClass类中包含了属性、方法、父类、关联对端、实现的接口MyUmlInterface类中包含了属性、方法、关联对端、实现的接口MyUmlOperation类中包含了参数
-
这样封装存储之后架构是比较清楚并且有层次感的,需要实现的查询方法也相对比较好实现了
-
第十四次作业
UML类图
- 架构设计简述
- 本次作业要求实现对类图、状态图、顺序图进行解析
- 把需要解析的状态图的各个元素分成四个层次
UmlStateMachine、UmlRegionUmlState、UmlPseudoState、UmlFinalStateUmlTransitionUmlEvent
- 把需要解析的状态图的各个元素分成三个层次
UmlInteractionUmlLifelineUmlMessage、UmlEndpoint
- 自建
MyUmlXxx类对其中一些元素进行封装MyUmlInteraction类中包含参与对象、消息、属性MyUmlRegion类中包含初始态、终止态、中间状态、状态迁移MyUmlState类中包含可达的状态MyUmlTransition类中包含触发事件
- 这次作业的难度并不大,还是一样理清思路就好,需要实现的方法复杂度也不高
第十五次作业
Uml类图(与第十四次作业相同)
- 架构设计简述
- 这次作业并没有新增需要解析的元素和需要实现的查询方法,而是新增了模型有效性检查,一共八个规则,需要在
END_OF_MODEL后进行检查,如果出现错误就退出运行不再进行后续查询,同时每个测试点只会出现一种规则错误 - 八种规则的实现
R001、R005、R006、R007、R008的实现都很简单,在相应的封装类中实现检查方法然后遍历调用即可R002、R003、R004相对而言难一些,需要考虑的比较全面,同样是在相应的封装类中实现检查方法,使用BFS实现,然后遍历检查。由于CPU时间很充裕,所以索性直接对每个结点都进行BFS
- 这次作业并没有新增需要解析的元素和需要实现的查询方法,而是新增了模型有效性检查,一共八个规则,需要在
二、架构设计及OO方法理解的演进
第一单元
多项式求导——噩梦的开始
到现在还清楚的记得面对第一次作业指导书的绝望感,那么长的指导书,看懂都是一个大问题,更何况还要很好地实现出来,甚至还有性能分。。。
尽管寒假是有预习课程的,但是当时并没有下很大功夫去学习,只是为了完成预习课程的作业,对于Java的认识处于容器只会用ArrayList,类和接口傻傻分不清楚的情况,当时还觉得这Java怎么那么多事儿啊,还得建类什么的。
那时候是很痛苦的,一方面是对Java的不熟悉,另一方面是编程思想的转变。尽管在第一次作业的设计过程中自认为已经很OO了,但是第二次作业指导书放出来之后就知道出大问题了,不得不进行重构,感觉自己在一些问题的处理上还是很面向过程,所以就花更多的时间去思考去设计。第一单元是我花费时间最多的一个单元,而且最后对于作业的完成其实还是很不满意,大正则让代码很不美观,但是当时实在不想重构了。
另外还有checkstyle的问题,刚开始确实有些不适应,但是按照一定的规则去写代码,确实让自己看着也舒服很多,从第一次作业写完一大堆问题,到第三次作业写完只需要对几个小细节进行修改
第二单元
电梯——死锁、死锁、死锁
一直听说电梯是OO四个单元里面最难处理的,亲身经历了之后觉得并非如此,电梯几乎是四个单元里最简单的一个单元,尽管多线程的不确定性很讨厌,莫名其妙的死锁让我血压拉满,出了问题没办法复现,但是难度确实不大。
第一次作业是很简单的,但是指导书给出的调度算法一方面并不容易实现,另一方面性能也不如人意,所以采用了LOOK算法,容易实现性能也还行。但是当时并没有把调度器作为一个线程实现。由于担心后续的拓展,就想着把调度器也搞成一个线程,当时这个重构大概用了十个小时左右吧,当时对多线程实在不了解,一边摸索一边设计,动不动就写死锁,最后搞得中测的十次机会全都用完了,还因为最后忘记改checkstyle被扣了几分。
但是,这十个小时的重构真的挺香的,真的把多线程搞懂了些皮毛了,先苦后甜了属于是,第二次作业当时就写了两个小时,第三次作业由于作业的设置,不换乘的性能在随机数据的情况下更好,也就写了两三个小时,当时刚经过第一单元,感觉电梯真是太棒了。
第三单元
JML——给你机会(伪代码)你不中用啊
这个单元的风评是真的好,大家都说JML简单,因为这单元完全不需要担心架构设计问题,官方包都帮我们设计好了,我们只需要按部就班对每个类每个方法进行理解和实现就好,其中有一些复杂度高的方法用到了并查集、最短路等算法。
官方包的架构非常OO,在实现的过程中能感受到架构层次都很清楚。
只是很可惜,第三次作业由于评测机的数据生成并没有写的很好,有一处小笔误没能发现,导致强测有些爆炸。
第四单元
UML——最终章
第四单元的难点主要在于理解UML图,理清层次,一层一层实现。在写作业的时候没什么感觉,感觉就是理解了UML之后还挺简单的,但是写下这篇博客的时候才发现,我似乎无形之中已经有些摸到了什么是面向对象的编程思想。
面对复杂的结构,应该怎样设计架构,怎样设计结构层次,使用什么样的数据结构去组织。不知不觉间从看到了指导书就上手去写,架构设计一塌糊涂,变成了看到指导书先有一个全局的认识,然后进行合理的架构设计,再对架构进行实现。
三、对测试的理解与实践的演进
前三个单元都是随机生成数据+手动构造阴间数据,第四单元难度不大,理解的也比较清楚,对自己比较自信,所以就没有写评测机(好吧其实就是懒)。
- 第一单元——正则表达式生成数据,与
Python的求导结果进行比对 - 第二单元——全随机生成数据,对电梯每一步的运行进行检测
- 第三单元——不太好描述的数据生成策略,对拍检验
- 第四单元——没有评测机,
好耶!
前两个单元的评测机相对来说都比较好写,相对而言测试比较全面,所以强测基本没有出现问题,之所以说基本是因为电梯有个强测点超时(然后原封不动交上去就过了,这就是多线程!)。第三单元的数据生成就比较难了,全随机势必会导致大量的无效数据,数据生成方面下了很大的功夫,但是还是有所疏漏,很巧的是,疏漏的地方恰好对应作业代码中的唯一一处笔误,可能这就是命吧(笑)。
另外,在第三单元课程组推荐我们使用Junit进行单元测试,但是我个人并不习惯于使用Junit,感觉很繁琐,效果也并不是特别好,可能还是自己不太会用吧。
四、课程收获
-
一门新的编程语言
Java——毫无疑问 -
正则表达式、多线程、JML、UML——想必大家都多少有所收获
-
面向对象的编程思想——从面对第一次作业指导书的手足无措到面对最后一次作业指导书的从容不迫,从看到需求就动手写码到纵览全局先进行架构层次设计再实现,我想我已经学到了面向对象的编程思想的一些皮毛
-
自动化测试——怎样从零开始搭建一个评测机
-
代码风格——从不在意自己的代码风格,到现在命名的时候都要想一想自己有没有按照规则命名
五、改进建议
- 希望课程组能够增加丰富一下预习课程。预习课程的内容实在很有限,并且相对来说比较简略,是不是能够增加一些先导理论课内容,并且加一些视频对一些内容进行更详尽的讲解。
- 希望减少互测环节中一个互测屋中的人数。设置互测环节的一个重要意义就在于阅读他人的代码,学习他人代码中的可取之处。但是现在互测屋中的人实在太多,作业的代码量相对来说已经不小了,要读六七份代码,实在不太现实。
- 希望课程组在编写指导书的时候更加注重一些小细节。点名道姓就是第四单元,很多小问题完全可以在指导书里面说的更清楚一些。
- 希望在每次实验结束后给出相应的正确答案和成绩查询。实验真的很有收获,特别是第二单元,架构参考了很多实验的代码,但是每次做完实验也不知道自己到底做的怎么样,也不知道正确的结果应该是怎样的。
六、碎碎念
这是OO的最后一次作业,最后一篇博客了。
这16周,一次次作业、一次次实验,都历历在目。
有喜悦、兴奋、快乐、轻松,
当我终于通过了中测;
当我终于完成了重构;
当我强测没有出问题;
当我终于de完了bug;
当我没有被任何人hack;
更有郁闷、难过、痛苦、绝望,
当我发现需要重构;
当我发现自己被hack;
当我对架构的设计毫无头绪;
当我始终找不到多线程的bug;
当我强测因为一个小笔误而爆炸;
但是现在,这一切都已经结束,无论我做的好还是不好,都已经尘埃落定。
也许我以后都不用再学习这样一门事儿这么多的课了,但是它给我的东西,却会跟着我继续前行。
它告诉我要学会设计;
它告诉我要有好的代码风格;
它告诉我要学会做测试;
它告诉我要学会读他人的代码;
它告诉我多线程有不确定性;
它告诉我设计规格时一定要严谨;
它告诉我。。。。。。
它告诉我太多太多,有些我明白了,有些还并不能够理解,但我想当我有一天又遇到了类似的问题,或许会恍然想起——我在学OO的时候似乎学过。
我在回家的高铁上,终于完成了这篇博客,算是给这单元,这门课,这学期都画上一个圆满的句号吧。
——2021.6.26

浙公网安备 33010602011771号